2011-06-28 20 views
1

我讀叫MyClass的 代碼這樣的父類,如何在這種情況下重構或修復循環引用? java的

public class MyClass extends CompositeObject{ 
    protected Map<String,MyAttibute> attributes = new  

    HashMap<String,MyAttribute> 
    ..... 

} 

在MyAttribute類, 這樣的代碼

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

} 

這實際上是一個圓形reference.Which製造麻煩,當你做深度serlization和平等。它可能不是一個好的設計。如何避免它?修復後,我們仍然可以很容易地從它的屬性中找到父類。

P.S.我看到另外兩個班的設計

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; 
    .... 
} 

你覺得這種設計好嗎?爲什麼? 正如你可以看到這些類定義的域是相當普遍的。 那麼任何人都可以分享一些關於它的見解嗎?讓事務知道其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

我不認爲你的代碼可以work.this.definedOnClass.equals(other.definedOnClass)這個調用MyClass的equals方法,這將最終與StackOverflowError。 –

+0

@clark不,如果MyClass調用MyAttibute.equals2()而不是等於 –

+0

@ratchel好吧,我明白了。你把平等分成兩部分。這個想法很好。但是,代碼風格可以更清潔一些嗎? –

相關問題