2011-06-28 17 views
1

が、私はこのこの場合、循環参照をリファクタリングまたは修正する方法はありますか? Javaの

public class MyAttibute extends MyObject 
{ 
    private MyClass definedOnClass;//point to its parentClass 

} 

よう コードこのようなMyClassのと呼ばれる親クラス、

MyAttributeクラスで
public class MyClass extends CompositeObject{ 
    protected Map<String,MyAttibute> attributes = new  

    HashMap<String,MyAttribute> 
    ..... 

} 

、 コードを読んでいるこれは、円形のreference.Whichは、トラブル時にあなたを作る実際にされました深いserlizationと等しくする。そしてそれは良いデザインではないかもしれません。それを避ける方法は?また、それを修正した後も、その属性からparentClassを簡単に見つけることができます。

P.S.私は別の2つのクラスのデザインを参照してください

public class Transaction{ 
    private ChangeManager parentManager; 
    .... 
    public Transaction(ChangeManager parentManager) 
} 

public class ChangeManager { 
    //record transaction when commit 
    private List<Transaction> transactions = new ArrayList<Transaction>(); 
    Transaction currentTransaction; 
    .... 
} 

あなたはこの種のデザインが良いと思いますか?どうして? これらのクラスが定義しているドメインがわかるように、かなり一般的です。 誰もそれについていくつかの洞察を共有できますか? TransactionにChangeManagerが認識され、MyAttributesにそのプロパティのMyClassが認識されるようにすることは有害でしょうか?コメントは大歓迎です。短所と長所

+0

を扱うことができることに注意してくださいからテストするときにequalsメソッドを異なるを使用することができますそれ自身の子供への影響? (それは私にとっては完全にはっきりしないので、そうでないとこれを無視してください)ああ、それは絶対に確かに良いアイデアではありません。シリアル化の問題はひどいデザインの上に氷結するだけです。クラスは子どもの知識を必要とすることは絶対に避けてはいけません – Voo

+0

@ Voo、私たちはこの問題を直列化を扱うときに満たします。しかし、データモデルは私たちによって設計されていません。だからこれが問題です。 –

+0

これは質問からはっきりと分かりません(特に "これは良いデザインですか?") - "この恐ろしいデザインを回避するにはどうすればよいのですか?")しかし、definedOnClassがサブクラス自体である場合どのように修正できるかは分かりません(その場合、再帰的な基底ケースはありません)。それがうまくいけば私は思うだろう - 正確なエラーは何ですか? – Voo

答えて

0

親として論理的に独立した子としてMyAttibuteを置くので、attr1.equals(attr2)はそれぞれの親を伴わない(シリアル化と同じ;ストリームには含めない)、definedOnClassプロパティ

か、MyClassの

public class MyAttibute extends MyObject 
{ 
    private NgcClass definedOnClass;//point to its parentClass 

    public boolean equals(Object o){ 
     if(o instanceof MyAttibute){ 
      MyAttibute other = (MyAttibute)o; 

      if(!this.definedOnClass.equals(other.definedOnClass)) 
       return false;//when not from the same parent they are never the same 

      return this.equals2(other); 
     } 
     return false; 
    } 

    //this one should then be called from MyClass 
    public boolean equals2(MyAttibute o){ 
     //check equality without worrying about definedOnClass 
    } 
} 

Javaのobjectstreamsのデフォルトの直列化は、私が正しくあなたを理解していれば、あなたの親クラスが参照を持っている循環参照

+0

あなたのコードは、MyClassのequalsメソッドでthis.defined Protected(other.definedOnClass)呼び出しを行うことはできません。これはStackOverflowErrorになります。 –

+0

@clark MyClassがequalsの代わりにMyAttibute.equals2()を呼び出す場合は、 –

+0

の代わりに@ratchelを入力してください。あなたは2つの部分に等号を分割します。その考えは良いです。しかし、コードスタイルは少しきれいにすることができますか? –

関連する問題