반응형
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이라고 합니다. (코드를 빌려주면 빌린 코드를 사용하는 형태)
반응형
'개발이야기 > Java' 카테고리의 다른 글
Java concurrent 함수 - invokeAll() (0) | 2018.09.19 |
---|---|
Java 8 Lambda를 이용한 Decorate pattern (0) | 2017.12.15 |
Java 8 Lambda를 이용한 lazy evaluation (0) | 2017.12.13 |
Java 8 Lambda를 이용한 virtual proxy pattern (0) | 2017.12.12 |
Java 8 Lambda를 이용한 Execute around pattern #2 - lock 관리 (0) | 2017.12.07 |