반응형
public class ChanningClass {
public final String status;
private ChanningClass(String status){
this.status = status;
}
// BuildersImpl 인스턴스를 처음 생성할 메서드가 필요하다.
public static Builders startMethod() {
return new BuildersImpl();
}
// Builder 인터페이스
interface Builders{
Builders method1(String doSomething);
Builders method2(String doSomething);
ChanningClass build();
}
// Builder 구현체
private static class BuildersImpl implements Builders{
private String status;
BuildersImpl(){
this.status = "";
}
@Override
public Builders method1(String doSomething) {
this.status = this.status + doSomething;
return this;
}
@Override
public Builders method2(String doSomething) {
this.status = this.status + doSomething;
return this;
}
// 작성한 상태값을 인스턴스를 만들며 반환
@Override
public ChanningClass build() {
return new ChanningClass(this.status);
}
}
}
메서드를 시작할 때 startMethod() 내부 인스턴스를 만들고,
인터페이스를 이용해 메서드 체이닝을 한다.
메서드가 오버라이딩 되어있다면 자식 메서드가 동작한다는 점을 이용하여 동작시킨다.
메서드가 종료할 때 build() 외부 인스턴스를 만들어 반환한다.
ChanningClass builders1 = ChanningClass.startMethod().method1("aaaa").method2("bbbb").build();
ChanningClass builders2 = ChanningClass.startMethod().method2("bbbb").method1("aaaa").build();
System.out.println(builders1.status);
System.out.println(builders2.status);
@Builder
public static Book.BookBuilder builder() {
return new Book.BookBuilder();
}
public static class BookBuilder {
private Long id;
private String BookName;
private Publisher publisher;
private List<BookLoan> loanBookList;
private List<BookReservation> bookReservationList;
BookBuilder() {
}
public Book.BookBuilder id(final Long id) {
this.id = id;
return this;
}
public Book.BookBuilder BookName(final String BookName) {
this.BookName = BookName;
return this;
}
public Book.BookBuilder publisher(final Publisher publisher) {
this.publisher = publisher;
return this;
}
@JsonIgnore
public Book.BookBuilder loanBookList(final List<BookLoan> loanBookList) {
this.loanBookList = loanBookList;
return this;
}
@JsonIgnore
public Book.BookBuilder bookReservationList(final List<BookReservation> bookReservationList) {
this.bookReservationList = bookReservationList;
return this;
}
public Book build() {
return new Book(this.id, this.BookName, this.publisher, this.loanBookList, this.bookReservationList);
}
@Builder는 굳이 인터페이스까진 만들지 않는다.
내부 인스턴스를 만드는 builder(), 외부 인스턴스를 만드는 build()
시작과 끝 메서드의 사용 방식은 같다.
반응형
'프로그래밍 > 자바' 카테고리의 다른 글
[JAVA] 14장. 람다, 스트림 (0) | 2022.07.31 |
---|---|
[JAVA] 13장. 쓰레드 (0) | 2022.07.31 |
[JAVA] 12장. 제네릭스, 열거형, 어노테이션 (0) | 2022.07.31 |
[Java] equals()와 hashCode() 사용, HashSet에서의 활용 (0) | 2022.07.30 |
11장 컬렉션 프레임 워크 (0) | 2022.07.28 |