😎

Builderパターン(Effective Java)

2024/09/10に公開

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