java 14 이전 버전에서는 데이터 클래스를 생성하려면, 여러 보일러 플레이트 코드가 필요하다.
다음 샘플처럼 hashcode, equals, toString 함수를 추가해줘야한다.
public class Person {
private final String name;
private final String address;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
@Override
public int hashCode() {
return Objects.hash(name, address);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
} else if (!(obj instanceof Person)) {
return false;
} else {
Person other = (Person) obj;
return Objects.equals(name, other.name)
&& Objects.equals(address, other.address);
}
}
@Override
public String toString() {
return "Person [name=" + name + ", address=" + address + "]";
}
// standard getters
}
때문에 속성 하나를 추가할 때마다, 다른 함수들을 수정해야한다.
그리고 함수들을 오버라이딩하다보니, 해당 클래스가 데이터 클래스라는 것을 쉽게 파악하기가 어렵다.
record keyword
public record Person (String name, String address) {}
java14의 record를 사용하면, 위의 장황했던 코드를 한줄로 줄일 수 있다.
record는 컴파일러에서 equals, hashCode, toString, final 필드, public 생성자를 자동으로 만들어준다.
때문에 보일러 플레이트 코드를 일일이 추가하지 않아도 된다.
Constructor
record를 선언하면, 컴파일러는 전체 필드를 생성해주는 생성자를 자동으로 추가해준다.
public Person(String name, String address) {
this.name = name;
this.address = address;
}
그런데 다음과 같이 유효성 검증을 추가하거나, 커스텀 생성자를 만들 수도 있다. 그러나 로직은 최대한 간결하게 구현할 것을 권장한다.
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");
}
}
Static field / method
일반 자바 클래스처럼 Static field와 method를 추가할 수도 있다.
public record Person(String name, String address) {
public static String UNKNOWN_ADDRESS = "Unknown";
public static Person unnamed(String address) {
return new Person("Unnamed", address);
}
}
참고
'소프트웨어-이야기 > 프로그래밍 언어와 프레임워크' 카테고리의 다른 글
Null Object Pattern (0) | 2022.06.04 |
---|---|
[DDD] Specification 명세 (0) | 2022.05.15 |
Spring과 의존성 주입 (DI) (0) | 2022.04.18 |
Hibernate Query Plan Cache란? (0) | 2022.03.06 |
Domain services vs Application services (0) | 2021.06.05 |