java - 返回 null 的构建器模式

标签 java jakarta-ee builder-pattern

我正在使用构建器模式,但在设置 feilds 后,其返回 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 的输出,
但出现空指针异常

最佳答案

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

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();

关于java - 返回 null 的构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20698190/

相关文章:

java - 无需请求即可从tomcat获取服务器端口号

java - 如何在不创建额外实例变量的情况下创建对象数组?

java - 如何使用字符串作为月份名称参数

jsp - Tomcat 提供另一个 URL

Python,结合长构建器路径和注释

java - 如何在我的 ModelInput 类中使用 Joshua Bloch 版本所描述的构建器模式?

java - 具有相同键的多个条目不可变映射错误

java - 如何在 Java 中从一个字符集解码文本并将其转换为另一个字符集?

java - 你能在一个 SQL 语句中返回多个 COUNTs 吗?

java - 根据用户定义的结果和条件在包含多个相关或不相关表的数据库中动态构建 SQL