0

私はビルダーパターンを使用していますが、フィールドを設定した後、次のように返されnullpointerExceptionます:

package com.test.sample1;

 public class MessageID {

public int BOI1;
public int DOI2;
public int CO3;

public MessageID(int BOI1,int DOI2,int CO3){
    this.BOI1=BOI1;
    this.DOI2=DOI2;
    this.CO3=CO3;
}


public int getBOI1(){
    return BOI1;
}
public int getDOI2(){
    return DOI2;
}
public int CO3(){
    return CO3;
    }
 }

ここに BaseServiceRequest.java があります ::

        package com.test.sample;

        import com.test.sample1.MessageID;

        public class BaseServiceRequest   {


             MessageID messageID;

            public BaseServiceRequest(BaseServiceRequestBuilder builder) {
                this.messageID = builder.messageID;

            }

            public MessageID getMessageID() {

                return messageID;
            }

            public static class BaseServiceRequestBuilder {

                private MessageID messageID;

                public BaseServiceRequestBuilder messageID(MessageID messageID) {   
                    this.messageID =messageID;      
                return this;
                }

            }
        }

ここにメインクラスがあります::

       package com.test.sample;

      import com.test.sample.BaseServiceRequest.BaseServiceRequestBuilder;
      import com.test.sample1.MessageID;

      public class Wrapper {

        static BaseServiceRequestBuilder builder = new BaseServiceRequestBuilder();
        static BaseServiceRequest request;

  public static void main(String[] args) {
    test(builder);
    int syso = request.getMessageID().getBOI1();
    System.out.println(syso);

  }

   public static void test(BaseServiceRequestBuilder builder) {
   builder.messageID(new MessageID(23, 34, 12));
  }

  }

request.getMessageID().getBOI1()で 23の出力を取得する必要があります
が、null ポインター例外が発生します

4

1 に答える 1

4

builderこれは、の build メソッドを呼び出して結果を破棄しているためです。結果を保存します。

request = builder.messageID(new MessageID(23, 34, 12));

これはビルダー パターンの実際の例ではないことに注意してください。まさに工場です。最も有用な Builder クラスは、流暢な APIを使用してプロセスを明確にし、バグが発生しにくくしています。 Builder オブジェクトには、次のような新しいインスタンスを構築するために必要な中間状態が含まれています。

request = new BaseServiceRequestBuilder().boi1(23).doi2(34).co3(12).build();

おそらく何かの着信リクエストから、すでにMessageIDオブジェクトを持っている場合、ビルダーはそれをパラメーターとして受け入れることもあります。

request = new BaseServiceRequestBuilder().messageID(id).build();
于 2013-12-20T07:10:15.850 に答える