我有两门课,这两门都提到其他物体。 它们认为类似(简化了这一规定;在我的实际领域模式A类中,有B类清单,每个B类参照的是A类:
public class A {
public B b;
public String bKey;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((b == null) ? 0 : b.hashCode());
result = prime * result + ((bKey == null) ? 0 : bKey.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof A))
return false;
A other = (A) obj;
if (b == null) {
if (other.b != null)
return false;
} else if (!b.equals(other.b))
return false;
if (bKey == null) {
if (other.bKey != null)
return false;
} else if (!bKey.equals(other.bKey))
return false;
return true;
}
}
public class B {
public A a;
public String aKey;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((a == null) ? 0 : a.hashCode());
result = prime * result + ((aKey == null) ? 0 : aKey.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof B))
return false;
B other = (B) obj;
if (a == null) {
if (other.a != null)
return false;
} else if (!a.equals(other.a))
return false;
if (aKey == null) {
if (other.aKey != null)
return false;
} else if (!aKey.equals(other.aKey))
return false;
return true;
}
}
The hashCode
and qualitys
have been produced by Eclipse using both areas of A and B. 问题是,在<条码>中,对任一物体均采用<条码>。 由于两者都称作其他物体的<代码>等于和hashCode
方法。 例如,以下方案将失败<代码>StackOverflowError。 根据上述目标:
public static void main(String[] args) {
A a = new A();
B b = new B();
a.b = b;
b.a = a;
A a1 = new A();
B b1 = new B();
a1.b = b1;
b1.a = a1;
System.out.println(a.equals(a1));
}
如果以这种方式界定与循环关系相关的领域模式存在固有的错误,请让我知道。 只要我能说这是一个相当常见的情况,那是正确的?
界定<代码>hashCode和此处平等
的最佳做法是什么? 我想在<代码>上保留所有领域。 这种方法能够真正地对目标进行深刻的平等比较,但我看不出我如何处理这个问题。 感谢!