상속이있는 @Data 주석 lombok에서 equals / hashCode 경고


105

나는 다른 것으로부터 상속받는 엔티티가 있습니다. 다른 한편으로는 상용구 코드를 줄이기 위해 lombok 프로젝트를 사용하고 있으므로 @Data주석을 달았습니다 . @Data상속 이있는 주석은 다음 경고를 생성합니다.

이 클래스가 java.lang.Object를 확장하지 않더라도 equals / hashCode 구현을 생성하지만 수퍼 클래스에 대한 호출은 없습니다. 의도적 인 경우 @EqualsAndHashCode(callSuper=false)유형에 추가 하십시오.

그것은 주석 추가하는 것이 좋습니다 @EqualsAndHashCode (callSuper = true)또는 @EqualsAndHashCode (callSuper = false)? 이 추가되지 않은 경우, 어느 하나 callSuper=false또는 callSuper=true?

답변:


125

기본값 입니다 false. 그것은 당신이 그것을 지정하지 않고 경고를 무시하면 얻는 것입니다.

예, Object가 아닌 다른 것을 확장 하는 @EqualsAndHashCode어노테이션이있는 @Data클래스 에 어노테이션 을 추가하는 것이 좋습니다 . true또는 이 필요한지 여부는 말할 수 없습니다 false. 이는 클래스 계층 구조에 따라 다르며 사례별로 검사해야합니다.

그러나 프로젝트 또는 패키지의 lombok.config경우 Object의 직접 하위 클래스가 아닌 경우 수퍼 메서드를 호출 하도록에서 구성 할 수 있습니다 .

lombok.equalsAndHashCode.callSuper = call

참고 항목 구성 시스템 설명서 이것이 어떻게 작동하는지에 대한, 그리고 @EqualsEndHashCode문서 지원되는 구성 키를.

공개 : 저는 롬복 개발자입니다.


나를 위해 일했습니다. 그러나 delombok 플러그인이이 구성 파일을 선택하려면 리소스 디렉터리가 아닌 자바 소스 루트 디렉터리에 있어야합니다. 즉, src / main / resources가 아닌 src / main / java에
있어야

1
@Roel 왜 기본값이 거짓인지 궁금합니다. 나는 그 반대를 예상했을 것이다. 또한 기본적으로 super를 호출하기 위해 toString ()을 얻는 동등한 방법이 있습니까? "@ToString (callSuper = true)"를 수행 할 수 있지만 이러한 구성 설정은 표시되지 않습니다. 감사.
David Siegal 2018-04-16

@Data 전후에 @EqualsAndHashCode (callSuper = true)를 추가해도 문제가됩니까?
Anna Klein

순서를 @AnnaKlein하는 것은 중요하지 않습니다
댄 카터

47

@EqualsAndHashCode(callSuper=true) 경고를 해결해야합니다.


1
Roel의 제안이 "lombok.equalsAndHashCode.callSuper = call"대신 수행되어야한다고 생각하지 않으므로 각 클래스에 대한 결정을 내려야합니다.
Anna Klein

4
@AnnaKlein 나는 그렇게 생각하지 않는다. 사실이 답변은 주석이어야합니다. 여기에는 새로운 정보가 없습니다. 제 질문에서 찾을 수 있습니다. 나는 @EqualsAndHashCode경고 가 해결된다는 것을 알고 있었다 .
Pau

실제로 허용되는 답변 (및 아래 답변)에 따라 주석에서 'callSuper = true'또는 'callSuper = false'중에서 선택해야합니다.
Adam Wise

28

주요 원래 질문은 다음과 같습니다.

@EqualsAndHashCode (callSuper = true) 또는 @EqualsAndHashCode (callSuper = false) 주석을 추가하는 것이 좋습니까?

허용되는 대답은 기본적으로 다음과 같습니다.

...조건에 따라서...

이를 확장하기 위해 @EqualsAndHashCode에 대한 문서 에는 선택할 수있는 확실한 지침이 있습니다. 특히이 IMHO :

callSuper를 true로 설정하면 생성 된 메소드에 수퍼 클래스의 equals 및 hashCode 메소드를 포함 할 수 있습니다. hashCode의 경우 super.hashCode ()의 결과가 해시 알고리즘에 포함되어 있고 동일하면 생성 된 메서드는 super 구현이 전달 된 객체와 같지 않다고 생각하면 false를 반환합니다. 모든 equals 구현이이 상황을 적절하게 처리하는 것은 아닙니다. 그러나 lombok에서 생성 한 equals 구현은이 상황을 적절하게 처리하므로 lombok에서 생성 한 equals 메소드가있는 경우에도 수퍼 클래스 equals를 안전하게 호출 할 수 있습니다.

이것을 조금 정리하려면 : 상태 정보가 없거나 자체적으로 @Data 주석을 사용하는 수퍼 클래스에서 상속하거나 "상황을 적절하게 처리"하는 등호 / 해시 구현이있는 경우 'callSuper = true'를 선택하십시오. -이것은 상태 값의 적절한 해시를 반환한다는 의미로 해석됩니다.


나는 이것이 callSuper = false와 callSuper = true 중에서 선택하는 방법을 잘 설명하는 대답이라고 생각합니다.
prageeth

10

슈퍼 클래스의 멤버도 비교하려면 @EqualsAndHashCode(callSuper=true). 그러나 현재 클래스의 필드 만 비교하려는 @EqualsAndHashCode(callSuper=false)경우 기본 옵션을 사용할 수 있습니다 .

Delombok 기능 을 사용하면 true이 행을 설정 하면 생성 된 equals 메소드에 추가 된다는 차이점을 알 수 있습니다 if (!super.equals(o)) return false;. 두 개체를 비교할 때 고려해야하는 수퍼 클래스의 멤버가있는 경우 올바르게 비교하려면 true로 설정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.