我有以下用作图表一部分的类:
public class MyNode {
private String name;
private Set parents;
private Set children;
// getters and setters
}
当我使用Eclipse时Source / Generate hashCode() and equals()
,它会生成以下方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((children == null) ? 0 : children.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((parents == null) ? 0 : parents.hashCode());
return result;
}
问题是这个方法从当前对象转到它的子节点,然后在计算第一个子节点的hashCode()时,它通过parents.hashCode()
但是不知道hashCode()已经被计算回到原始节点那里.然后它重新进入children
原始节点,它给出了一个美丽的无限循环.
问题:如何检查两个实例MyNode
是同一个对象,同时避免无限循环?visited
为了停止探索,在MyNode类中添加一个布尔值是否可以接受?或者有更好的解决方案吗?
谢谢!
你不应该使用儿童或者执行时,节点的父母hashCode
和equals
.它们是可变的属性.hashCode
更改边缘后计算将有所不同,将导致地图和集合集合损坏.
仅实现hashCode
和equals
使用不可变字段,这些字段为对象创建不同的自然键.名称可能是一个很好的候选人,除非它可以改变.
如果不存在不可变字段,则:
不要覆盖hashCode
和equals
方法,默认会没问题.它将使每个类实例都是唯一的.
制作一些独特的id字段(通过sequance)并将其用作种子hashCode
和比较equals
.