在Builder模式中,建造者对象必须先被实例化才能设置属性。如果没有正确实例化建造者对象就试图设置属性,则很容易抛出Null Pointer Exception(空指针异常)。这个问题通常发生在以下两种情况下:
PersonBuilder builder;
builder.setName("John"); // 这里可能抛出NullPointerException
PersonBuilder builder = new PersonBuilder();
Person person = builder.build(); // 如果没有设置必要属性,这里可能抛出NullPointerException
要解决这个问题,需要在Builder对象中使用Null Object pattern(空对象模式)。这种模式可以确保没有属性被设置时,仍然可以创建对象,而不会抛出Null Pointer Exception。
以下是一个使用空对象模式解决Builder Pattern Null Pointer Exception问题的示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 省略 getter/setter 方法
}
public class PersonBuilder {
private String name = ""; // 默认值可以是空字符串
private int age = -1; // 默认值可以是非法值
public PersonBuilder setName(String name) {
this.name = name;
return this;
}
public PersonBuilder setAge(int age) {
this.age = age;
return this;
}
public Person build() {
if (name.isEmpty() || age == -1) { // 如果有必要的属性没有被设置
return new NullPerson(); // 返回一个空对象
}
return new Person(name, age); // 否则创建真正的对象
}
private static class NullPerson extends Person {
public NullPerson() {
super("", -1);
}
}
}
在