둘 다 다른 객체에 대한 참조를 포함하도록 두 클래스를 정의했습니다.Java에서 순환 참조가있는 객체에 대해 equals 및 hashCode 구현
hashCode
및
equals
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;
}
}
는 이클립스에 의해 생성 된 : (내 실제 도메인 모델 클래스 A가 B의 목록을 포함에 각 B는 부모 A를 다시 참조가이 단순화) 그들은이 유사 A와 B 두 필드를 모두 사용합니다. 두 객체 모두에서 equals
또는 hashCode
메서드를 호출하면 StackOverflowError
이 반환되는데, 그 이유는 둘 다 다른 객체의 equals
및 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
및 equals
을 정의하는 가장 좋은 방법은 무엇입니까? equals
메서드의 모든 필드를 유지하여 개체에 대한 진정한 깊은 평등 비교를 유지하지만이 문제를 어떻게 해결할 수 있는지 보지 못합니다. 감사!
왜 부모에 대한 참조를 가지고 아이들을해야합니까? 이것은 당신의 삶이 직렬화와 관련하여 매우 복잡하게 만들 것입니다. – I82Much
저는 레거시 도메인 모델로 작업하고 있습니다. 내 직렬화는 본질적으로 자식 관계를 떠나 버리고 비 직렬화에 관계를 수정합니다. 순환 참조가 도메인 모델에서 공통된 사항이 아닌가? 기본 DB 관계는 순환 참조가있는 JPA 객체로 JBoss 도구에 의해 리버스 엔지니어링 된 OneToMany입니다. – Tom