Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type.

프로젝트 import 하고 뜬 경고 문구!

롬복 쓰다가 @Data가 있는 곳마다 @EqualsAndHashCode로 callSuper 옵션 false를 주란다.

@Data는 constructor, getter, setter, toString, equals, hashcode 등 메서드를 자동으로 생성한다.

이때 만들어진 equals와 hashcode 메소드가 부모 클래스 필드까지 고려할지 안 할지를 설정할 수 있다.

- callSuper = true: 부모클래스 필드 값도 동일한지 체크

- callSuper = false: 본인클래스 필드 값만 고려

 

@Data는 아주 강력해서 코드를 간결하게 짤 수 있다는 장점이 있지만 각 메서드가 만들어졌을 때 코드에 어떤 영향을 주는지 확실하게 알지 못한 채 사용한다면 side effect가 생길 가능성이 다분하다......

 

이번 기회에 lombok에서 조심해서 써야하는 어노테이션을 몇 가지 알 수 있었는데,

평소에 종종 쓰던 @AllArgsConstructor, @RequiredArgsConstructor는 생성자를 편리하게 만들어준다.

이 어노테이션들은 클래스에 정의된 순서에 따라 생성자 파라미터 순서를 정하므로 특히 자료형이 같은 경우 예상치 않은 동작 결과를 낼 수 있다.

 

따라서 대안으로 생성자를 하나 만든 뒤 @Builder를 사용하는 것을 추천한다.

빌더 패턴에서는 파라미터 순서로 생성자를 만들었던 @AllArgsConstructor, @RequiredArgsConstructor와 달리, 이름으로 값을 설정하기 때문에 리팩터링 하기 용이하다.

 

관련해서 자세하게 소개해주시는 링크!

https://kwonnam.pe.kr/wiki/java/lombok/pitfall

 

java:lombok:pitfall [권남]

 

kwonnam.pe.kr

 

 

+ Recent posts