생성자 작성하지 않아도 되고 toString, equals, hashCode 메소드에 대한 구현을 자동으로 제공함
기본적인 동작은 재정의할 수 있음
레코드는 암묵적으로 final 클래스임. abstract 선언 불가
다른 클래스 상속 받을 수 없고 인터페이스 구현은 가능함
생성자 Customization
validation을 위해 사용함
Record에 필요한 파라미터 그대로 받는 생성자
public record Person(String name, String address) {
public Person {
Objects.requireNonNull(name);
Objects.requireNonNull(address);
}
}
다른 파라미터를 받는 생성자
public record Person(String name, String address) {
public Person(String name) {
this(name, "Unknown"); // 이런 식으로 this를 불러주어야 함
}
}
컴파일 에러
public record Person(String name, String address) {
public Person {
Objects.requireNonNull(name);
Objects.requireNonNull(address);
}
public Person(String name, String address) {
this.name = name;
this.address = address;
}
}
위의 2개 생성자는 메서드 시그니쳐가 겹치게 되므로 컴파일 에러가 발생함
Serialize 에러
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.gccoffee.domain.OrderItem and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.example.gccoffee.domain.Order["orderItems"]->java.util.ArrayList[0])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.11.0.jar:2.11.0]
Jackson이 object를 serialize할 때, getter가 필요한데, record로 선언할 시 getter가 없음. 따로 명시해주어야 하는데, 이럴거면 그냥 class로 선언하고 @Getter 붙여주는 편이 훨씬 편할듯함