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

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

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

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



답변

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

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

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

lombok.equalsAndHashCode.callSuper = call

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

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


답변

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


답변

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

@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’를 선택하십시오. -이것은 상태 값의 적절한 해시를 반환한다는 의미로 해석됩니다.


답변

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

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


답변