我读过一个名为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是否有害?欢迎任何评论。缺点和优点。
答案 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的默认序列化可以处理循环引用