나는 다른 것으로부터 상속받는 엔티티가 있습니다. 다른 한편으로는 상용구 코드를 줄이기 위해 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로 설정해야합니다.