在这种情况下如何重构或修复循环引用? java的

时间:2011-06-28 23:28:30

标签: java design-patterns refactoring

我读过一个名为MyClass的父类 像这样的代码,

 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

}

这实际上是一个循环参考。当你进行深度血清化和平等时,它会制造麻烦。它可能不是一个好的设计。如何避免它?修复之后,我们仍然可以从其属性中轻松找到parentClass。

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

你觉得这种设计好吗?为什么? 正如您所看到的,这些类定义的域很常见。 那么有人可以分享一些有关它的见解吗?让Transaction了解其ChangeManager并让MyAttributes知道其属性中的MyClass是否有害?欢迎任何评论。缺点和优点。

1 个答案:

答案 0 :(得分:0)

将MyAttibute作为一个逻辑上独立于父节点的子节点,因此attr1.equals(attr2)不涉及相应的父节点(与序列化相同;不在流中包含它)并且您可以保留definedOnClass属性< / p>

或者从MyClass

进行测试时可以使用不同的equals方法
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的默认序列化可以处理循环引用