2017-12-18 1 views
1

자바 라이브러리를 만들고 있었는데 다음과 비슷한 문제가 발생했습니다. 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), 해시 코드에서도 같습니다. 이것은 분명히 무한 재귀 적이므로 변경되어야합니다. 내 질문은 이것이다 : 평등이라는 측면에서 다른 하나를 무시하는 것 이외에 이것을 피하는 방법이 있는가? 그렇지 않다면 어느 쪽이 다른 쪽을 무시해야하는지 어떻게 선택해야합니까?

+3

당신이 Bar''에서 Foo''의 인스턴스가 필요한 이유를 정말 의문을 제기한다. –

+0

모든 IDE는 당신을 위해'equals'와'hashcode' 메쏘드를 생성 할 수 있어야합니다. 그래서 IDE가 생각을하도록 할 수 있습니다. 인텔리전트 IDEA는 완벽하게 구현 된 이들을 생성 할 수 있습니다. –

+0

순환 의존성 문제가 있습니다. 이것을 제거하면 구현을 작성할 수 있습니다. –

답변

1

equals()에 대한 간단한 해결 방법은 먼저 정체성을 비교하여 단락에 있습니다 :

public boolean equals(Object o) { 
    if (o == this) { 
     return true; 
    } 
    // check type and fields etc. 
} 
+0

하지만 hashCode는 어떨까요? 당신은 정말로 다른 하나 없이는 가질 수 없습니다. –

+0

@OliverCharlesworth 사실,하지만 더 구체적인 예가 없으면이를 해결하기가 어렵습니다. 그 자체로 의미있는 필드는 클래스에 포함되어 있지 않습니다. – shmosel

관련 문제