😎
Builderパターン(Effective Java)
GoFのBuiderパターンではなく、Effective Javaに記載されいる方のBuilderパターン。
よくあるGetter/SetterをJavaBeansパターン、コンストラクタの引数で受けるのをテレスコーピング・コンストラクタというらしい。
はじめに
JavaBeansパターンの以下のような課題の解決策にできる。
- setterが固まって記述されていないのでコードが読みづらい
- パラメータ上書きがいつでもできるので、
- 不備の発見が難しくなる
- 上書きされていないことの確認が広範囲になる
- 改修時に影響調査が広範囲となり、調査漏れによる障害リスクが大きくなる
実装例
class User {
private final String firstName;
private final String lastName;
private final int age;
/** Builderパターン */
public static class Builder {
private final String firstName;
private final String lastName;
private final int age;
/** 必須パラメータだけコンストラクタ引数で受ける */
public Builder(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
/** 非必須を受けるメソッド */
public Builder age(int age) {
this.age = age;
return this;
}
public User build() {
return new User(this);
}
}
private User(Builder builder) {
firstName = builder.firstName;
lastName = builder.lastName;
age = builder.age;
}
}
// 使い方
User user = new User.Builder("姓", "名")
.age(20)
.build();
これを使うモチベーション
- 障害リスクが減る
- コードを読む量が減る
- デメリットは、極わずかな記述量増加・パフォーマンス低下・学習コストくらい
Discussion