- 경고문구
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.
- 경고의 의미
Lomok 의 @Data 는 @ToString, @EqualsAndHashCode, @Getter, @Setter 및 @RequiredArgsConstructor 를 한번에 생성시켜주는 어노테이션이다.
주로 모든 Model들에 @Data 어노테이션을 추가하게되는데, 상속받은 클래스의 경우 위 경고 메세지가 나온다. 아래의 경우 Student 클래스에서 경고가 난다.
@EqualsAndHashCode 를 수행하면서, 즉 equals() 함수와 hashCode() 함수를 각각의 클래스에 자동 생성을 하면서,
부모와 자식 클래스의 함수들이 중복이 되면서 나오는 경고이다.
@Data
public class Person {
private String name;
}
@Data //<= 여기에서 경고가 난다
public class Student extends Person {
private String school;
private Integer classNumber;
}
Java 객체(java.lang.Object)의 equals() 함수와 hashCode() 함수는 다음과 같다.
- equals() : 두 객체의 내용이 같은지 확인하는 함수
- hashCode() : 두 객체가 동일한 객체인지 확인하는 함수
equals()함수와 hashCode() 함수는 객체 내의 파라미터들이 고려되어 자동생성되는데,
위 경고는 부모 클래스의 파라미터들은 고려하지 않았다고 알리는 경고 문구인 것이다.
즉, 같은학교 같은 반에 이름이 다른 두 명의 학생이 있는데, 학교와 반만 보고 같은 사람이라고 하게되는 꼴이 된다는 뜻이다.
Student student1 = new Student();
student1.setName("홍길동");
student1.setSchool("카이초");
student1.setClassNumber("3");
Student student2 = new Student();
student2.setName("신춘향");
student2.setSchool("카이초");
student2.setClassNumber("3");
System.out.println(student1.equals(student2));
// => true 가 됨
- 해결 방법
부모의 파라미터까지 고려해서 equals()와 hashCode() 함수를 생성하려면
@RequiredArgsConstructor(callSuper=true) 를 입력해주면 된다.
@Data
public class Person {
private String name;
}
@Data
@RequiredArgsConstructor(callSuper=true) //<= 추가해준다
public class Student extends Person {
private String school;
private Integer classNumber;
}
* 참고: 부모클래스의 파라미터를 고려하지 않겠다고 의도한게 맞으면 @RequiredArgsConstructor(callSuper=false) 를 해주면 된다.
'Java' 카테고리의 다른 글
MacOS Big Sur 에서 Eclipse Birt 사용하기 (0) | 2021.09.29 |
---|---|
[Java] 함수를 매개변수로 전달하기 (0) | 2021.04.08 |
[스프링] Page 사용법 (0) | 2021.03.24 |
[Java] Map 을 String 으로 바꾸기 (0) | 2021.02.09 |
Java에서 외부 프로세스를 실행할 때 (0) | 2021.01.19 |