본문으로 바로가기

Java 8 Lambda를 이용한 Builder pattern

category 개발이야기/Java 2017. 12. 14. 01:14
반응형

Builder를 Lambda로

Builder pattern을 많이들 사용합니다. Java 8에서 지원되는 lambda를 사용하면, 좀더 간단하게 builder pattern을 구현할수 있습니다.

한단계씩 예제를 따라가면서 확인해 보시죠~


Builder가 필요한 코드

먼저 builder가 필요한 부분에 대한 코드를 보겠습니다.

public class Mail {
    public void from(String address) {...}
    public void to(String address) {...}
    public void subject(String line) {...}
    public void body(String message) {...}
    public void send() {...}
}

public void main(String[] args) {
    Mail mail = new Mail();
    mail.from(a@a.com)
    mail.to(b@b.com)
    mail.subject("without builder)
    mail.body("NOT efficient code...")
    mail.send()
}


고쳐야 겠다는 느낌이 오시는지요?

그럼 method chain을 사용할수 있는 형태로 바꿔보겠습니다.


Builder 사용

Builder는 각 method가 this를 return해주도록 하여 간단하게 변경할 수 있습니다.

public class MailBuilder {
    public MailBuilder from(String address) {...; return this;}
    public MailBuilder to(String address) {...; return this;}
    public MailBuilder subject(String line) {...; return this;}
    public MailBuilder body(String message) {...; return this;}
    public void send() {...}
}

public void main(String[] args) {
    MailBuilder mailBuilder = new MailBuilder ();
    mailBuilder.from(a@a.com)
               .to(b@b.com)
               .subject("without builder)
               .body("This is still sucks..")
               .send()
}

Builder pattern을 이용하면 cascade하게 method를 호출할수 있어 훨씬 깔끔해 보입니다만 좀더 smart하게 코드를 변경할 수 있습니다.

-

-

Lambda를 이용한 Builder

lambda를 이용하여 코드르 변경해 봅니다.

여기서는 send를 static으로 만들어 Consumer를 이용할 예정이며, new를 객체 외부가 아닌 내부에 숨겨서 사용합니다.


사실 더이상 builder는 아닙니다.

public class MailMaker {
    private MailMaker() {}

    public MailMaker from(String address) {...; return this;}
    public MailMaker to(String address) {...; return this;}
    public MailMaker subject(String line) {...; return this;}
    public MailMaker body(String message) {...; return this;}
    public static void send(final Consumer<MailMaker> contents ) {
        final MailMaker mail = new Mailmaker();
        contents.accept(mail);
        ...
    }
}

public void main(String[] args) {
    MailMaker.send(mail -> mail.from(a@a.com)
                               .to(b@b.com)
                               .subject("without builder)
                               .body("Wow it's handsome!")
                  )                               
}

new로 객체의 생성을 private constructor를 만들어 외부에서 막고 send()내부로 위임합니다.


MailMaker의 인스턴스는 내부에서 생성되고 그 인스턴스로 작업하여 리턴하는 형태를 loan pattern이라고 합니다. (코드를 빌려주면 빌린 코드를 사용하는 형태)



반응형