2013-12-20 145 views
0

我使用的建设者模式,但设置后,精密组件返回其nullpointerExceptionBuilder模式返回null

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的输出 但得到空指针异常

+0

这..没有真正的样子建造者模式可言。您正在明确构建对象。 –

+0

@ChrisHayes我看到了这个,并给我的答案添加了一个解释。对此表示欢迎。 – chrylis

+0

让它不是一个建设者模式,但我希望它设置领域的方式,我必须做什么改变,请具体。 –

回答

4

这是因为您正在调用builder的构建方法并将结果丢弃。保存结果:

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

请注意,这不是Builder模式的示例;这真的是一个工厂。最有用的生成器类使用流利的API使流程清晰,更少的错误倾向,和建造对象包含构建新的实例,比如这需要中间状态:

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

如果你已经有MessageID对象,或许可以从一些传入的请求,该生成器还可以接受它作为一个参数:

request = new BaseServiceRequestBuilder().messageID(id).build(); 
+1

'builder.messageID'返回一个构建器而不是一个请求;也没有构建方法。 – 2013-12-20 07:12:21

+0

我想在builder.messageID(new MessageID(23,34,12))上设置BOI1字段;并得到结果在int syso = request.getMessageID()。getBOI1(); –