0
public class MyPojo{
    String required;
    Integer optionalOne;
    Integer optionalTwo;

    private MyPojo(Builder builder){
        this.required = builder.required
        this.optionalOne = builder.one;
        this.optionalTwo = builder.two;
    }

    public static class Builder{

        String required;
        Integer optionalOne =0;
        Integer optionalTwo =0;

        public Builder(String req){
            this.required = req;
            return this;
        }
        public Builder optionalOne(Integer one){
            this.one = one;
            return this;
        }
        public Builder optionalTwo(Integer two){
            this.two = two;
            return this;
        }
        public MyPojo build(){
            return new MyPojo(this);
        }
    }
}

次に、次のように呼び出されます。

MyPojo myPojo = new MyPojo.Builder("req").optionalOne(1).optionalTwo(2).build();

それはすべて素敵ですが、いくつかの部分がわかりません。

呼び出しステートメントに 1 つ、メソッドに 1 つの2 つの Newbuild()ステートメントがありますが、作成される新しいオブジェクトは 1 つだけです ?

また、2 番目のオプションのパラメーターを指定せずに 2 回目の呼び出しを行うと、次のようになります。

MyPojo myPojo = new MyPojo.Builder("req").optionalOne(1).build();

optionalTwo がデフォルト値 (ゼロ) に戻るのはなぜですか。そして、最初に渡された値を保持しないでください(2)。これは静的クラスなので、1 つのインスタンスがすべての MyPojo 間で共有されますか?

4

2 に答える 2

3

このビット:

 new MyPojo().Builder("req")

次のようにする必要があります。

 new MyPojo.Builder("req")

したがって、最初に を作成しBuilder、次にBuildメソッド ( buildbtw の方が良いでしょう) が不変オブジェクトを作成します。

2 番目のインスタンスを作成すると、それは最初のインスタンスとはまったく別のものになります。Builderクラスが static として宣言されていることに惑わされないでください。これは、 のインスタンスにBuilder暗黙的な「親」MyPojoクラス参照が関連付けられていないことを意味します。Builder個別のインスタンスのフィールドは、依然として完全に個別です。

于 2011-09-16T08:47:14.237 に答える
-1

ここにはいくつかのエラーがあります。書かれているように、コンパイルさえしません。

どのように動作するかについては、 Fluent Interfaceを参照してください。今考えます

MyPojo myPojo = new MyPojo.Builder(req).optionalOne(1).optionalTwo(2).Build();

(これはあなたが持っているものではありません、これはあなたが持つべきものです)

これがどのように機能するかです:

  1. new MyPojo.Builder(req)MyPojo.Builder オブジェクトを作成し、渡された req をに割り当てますthis.required
  2. .optionOne(1)に 1 を割り当てMyPojo.Builder.optionalOneます。次に、同じオブジェクト ( return this) を返します。次のステップを可能にするため、これが鍵です
  3. .optionOne(2)前の呼び出しで返されMyPojo.Builder.optionalTwoたオブジェクトに2 を代入します。MyPojo.Builderステップ 1 で作成した同じBuilderオブジェクトを引き続き使用していることに注意してください。thisが再び返されます。
  4. Build()Buildのメソッドを呼び出しBuilder、次にMyPojoコンストラクタを呼び出します。このメソッドはbuild、Java 命名規則に準拠するために呼び出す必要があります。

編集: コードはコンパイルできません。EDIT2:詳細な説明

于 2011-09-16T08:47:08.480 に答える