gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:43:27 25 4
gpt4 key购买 nike

我读了一个名为 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。

附注我看到另外两个类的设计

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 是否有害?欢迎任何评论。缺点和优点。

最佳答案

将 MyAttibute 作为逻辑上独立于父级的子级,因此 attr1.equals(attr2) 不涉及各自的父级(与序列化相同;不要将其包含在流中),并且您可以保留 DefinedOnClass 属性

或者您可以在从 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对象流的默认序列化可以处理循环引用

关于java - 在这种情况下如何重构或修复循环引用? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6514237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com