생성자 관련 3가지 어노테이션을 제대로 알지 못하고 사용하였기에 이번에는 확실히 알고 가고자 정리한다.
종류는 @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor가 있다.
먼저 @NoArgsConstructor
는 파라미터가 없는 생성자를 만든다. 필드에 final 있다면 초기화가 불가능하기에 컴파일러는 에러를 발생한다.
만약 @NoArgsConstructor(force = true)
를 사용하면 모든 final변수가 0/false/null값으로 초기화된다. 하지만 @NonNull
제약조건이 있어도 나중에 초기화를 해주기 전가지 null확인을 하지 못한다.
@RequiredArgsConstructor
는 특수 처리가 필요한 각 필드에 대해 파라미터를 갖는 생성자를 만들어준다.
-> 초기화 되지않은 fianl
필드나 @NonNull
이 붙은 필드에 대해 생성자를 생성해준다.
@AllArgsConstructor
는 클래스 모든 필드에 대한 생성자를 만든다.
@RequiredArgsConstructor
와 @NoArgsConstructor
는 사용을 지양해야한다고 한다.
이유는 아래의 코드를 보자.
@AllArgsConstructor/@RequiredArgsConstructor
public static class Foo {
private int f1;
private int f2;
}
Foo foo = new Foo(100, 200);
위 코드에서 가시성의 이유로 f1과 f2의 순서를 바꿨을 경우 타입이 같기 때문에 값이 서로 엇갈려 들어가도 알기가 힘들다.
따라서 아래 코드처럼 Builder사용을 권장한다.
public static class Foo {
private int f1;
private int f2;
@Builder
private Foo(int f1, int f2) {
this.f1 = f1;
this.f2 = f2;
}
}
Foo foo = Foo.builder().f1(100).f2(200).build();
@Builder
또한 다음에 제대로 정리를 해야할 것 같다.
출처: projectlombok.org
https://devk0ng.github.io/2021/07/30/lombok/#AllArgsConstructor