[Lombok] @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor 생성자 생성 애노테이션
by 델버2022. 12. 25.
Lombok 생성자를 만들어주는 애노테이션
Lombok 기능 중에 생성자를 만들어주는 애노테이션이 있다. 파라미터가 있는지 없는지를 기준으로 기능이 3가지로 만들어진다.
@NoArgsConstructor: 파라미터 없는 생성자 생성
@RequiredArgsConstructor: 파라미터 있는 생성자 생성(final or@NonNull인 필드)
@AllArgsConstructor: 파라미터 있는 생성자(모든 필드)
@NoArgsConstructor
파라미터가 없는 생성자를 생성해준다.
@NoArgsConstructor
public class Member {
private String name;
private int age;
private String mbti;
/* @NoArgsConstructor가 자동생성
public void Member() {}
*/
}
@Slf4j
public class LombokTest {
@NoArgsConstructor(force = true)
@Getter
public class Member {
private final String name;
private int age;
private String mbti;
}
@Test
public void test() throws Exception {
Member member = new Member();
String name = member.getName();
log.info("name={}", name);
}
}
@RequiredArgsConstructor
final 또는 @NonNull이 붙은 필드를 파라미터로 가진 생성자를 생성한다.
@NoArgsConstructor
public class Member {
private final String name;
@NonNull
private int age;
private String mbti;
/* @RequiredArgsConstructor가 자동생성
public void Member(String name, @NonNull int age) {
this.name = name;
this.age = age;
}
*/
}
Member member = new Member("memberA", 24);
스프링 DI에서 생성자 주입할 때 생성자를 생략하여 코드를 효율적으로 작성할 수 있다.
@Service
public class MemberService {
private final MemberRepository memberRepository;
private final OrderRepository orderRepository;
/* @RequiredArgsConstructor가 자동생성
public void MemberService( MemberRepository memberRepository,
OrderRepository orderRepository) {
this.memberRepository = memberRepository;
this.orderRepository = orderRepository;
}
*/
}
@NonNull필드는 파라미터 값으로 null이 들어오면 NullPointerException이 발생한다.
@Slf4j
public class LombokTest {
@RequiredArgsConstructor
@Getter
public class Member {
private final String name;
@NonNull
private int age;
@NonNull
private String mbti;
}
@Test
public void test() throws Exception {
assertThatThrownBy(() -> new Member("AA", 12, null))
.isInstanceOf(NullPointerException.class);
}
}
@AllArgsConstructor
모든 필드 파라미터를 가진 생성자를 생성한다.
@AllArgsConstructor
public class Member {
private final String name;
@NonNull
private int age;
private String mbti;
/* @AllArgsConstructor가 자동생성
public void Member(String name, @NonNull int age, String mbti) {
this.name = name;
this.age = age;
this.mbti = mbti;
}
*/
}
Member member = new Member("memberA", 24, "ENFP");
staticName을 사용해서 정적 팩토리 매서드를 추가할 수 있다. private 생성자를 생성하여 이것을 감싸는 정적 팩토리 매서드를 생성한다.
@RequiredArgsConstructor(staticName= ”of”)
public class Member {
private final String name;
@NonNull
private int age;
private String mbti;
private Member(String name, @NonNull int age) {
if (age == null) {
throw new NullPointerException("age is null");
} else {
this.name = name;
this.age = age;
}
}
public static Member of(String name, @NonNull int age) {
return new Member(name,age);
}
}
댓글