반응형

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() 

 

시작과 끝 메서드의 사용 방식은 같다.

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

반응형

+ Recent posts