1. ホーム
  2. java

[解決済み] 効率的なJavaのビルダーパターン

2022-05-18 08:39:37

質問

最近、Joshua BlochのEffective Javaを読み始めました。私はBuilderパターン[この本の項目2]のアイデアが本当に面白いと思いました。私はそれを私のプロジェクトで実装しようとしましたが、コンパイルエラーが発生しました。以下は、私がやろうとしていたことの本質的な部分です。

複数の属性を持つクラスとそのビルダークラス。

public class NutritionalFacts {
    private int sodium;
    private int fat;
    private int carbo;

    public class Builder {
        private int sodium;
        private int fat;
        private int carbo;

        public Builder(int s) {
            this.sodium = s;
        }

        public Builder fat(int f) {
            this.fat = f;
            return this;
        }

        public Builder carbo(int c) {
            this.carbo = c;
            return this;
        }

        public NutritionalFacts build() {
            return new NutritionalFacts(this);
        }
    }

    private NutritionalFacts(Builder b) {
        this.sodium = b.sodium;
        this.fat = b.fat;
        this.carbo = b.carbo;
    }
}

上のクラスを使おうとするクラス。

public class Main {
    public static void main(String args[]) {
        NutritionalFacts n = 
            new NutritionalFacts.Builder(10).carbo(23).fat(1).build();
    }
}

以下のようなコンパイラーエラーが発生します。

を含む包含するインスタンス を含むインスタンスが必要です。 が必要です。 NutritionalFacts n = new NutritionalFacts.Builder(10).carbo(23).fat(1).build();

メッセージの意味がわかりません。説明をお願いします。上記のコードはBlochが著書で提案した例と同様です。

どのように解決するのですか?

ビルダーを static クラスに変換します。そうすればうまくいくでしょう。もしそれが非静的であれば、その所有するクラスのインスタンスを必要とするでしょう - そしてポイントはそのインスタンスを持たないことであり、ビルダーなしでインスタンスを作ることさえ禁止しています。

public class NutritionFacts {
    public static class Builder {
    }
}

参照 ネストされたクラス