자바 라이브러리를 만들고 있었는데 다음과 비슷한 문제가 발생했습니다. Foo 클래스의 객체는 주로 Bar 클래스의 객체에 대한 저장소이며, 뿐만 아니라 일부 다른 데이터. 바 객체를 생성 한 푸 객체에 대한 참조를 포함하여 다양한 데이터를 저장 (참고 : 푸와 바 모두 불변)Java equals 및 hashCode 메소드에서 서로에 대한 참조가있는 재귀를 피하는 방법
class Foo {
private final Bar[] bars;
public Foo(int length) {
this.bars = new Bar[length];
for (int i = 0; i < bars.length; i++) bars[i] = new Bar(this);
}
}
class Bar {
public final Foo foo;
public Bar(Foo foo) {
this.foo = foo;
}
}
이 잘 좋은,하지만 난 등호와 hashCode 메소드를 만들려고 할 때 , 나는 Foo.bars가 Foo 객체의 정체성에 기본이되고 Bar.foo가 Bar 객체 (Bar.equals, Bar.equals, Bar.equals, Bar.equals, Bar.equals, java.util.Arrays.equals), 해시 코드에서도 같습니다. 이것은 분명히 무한 재귀 적이므로 변경되어야합니다. 내 질문은 이것이다 : 평등이라는 측면에서 다른 하나를 무시하는 것 이외에 이것을 피하는 방법이 있는가? 그렇지 않다면 어느 쪽이 다른 쪽을 무시해야하는지 어떻게 선택해야합니까?
당신이 Bar''에서 Foo''의 인스턴스가 필요한 이유를 정말 의문을 제기한다. –
모든 IDE는 당신을 위해'equals'와'hashcode' 메쏘드를 생성 할 수 있어야합니다. 그래서 IDE가 생각을하도록 할 수 있습니다. 인텔리전트 IDEA는 완벽하게 구현 된 이들을 생성 할 수 있습니다. –
순환 의존성 문제가 있습니다. 이것을 제거하면 구현을 작성할 수 있습니다. –