生成器类中的控制器如何将 null int 设置为 0?



我正在研究一个简单的生成器设计模式的例子。

所以我的问题是,如果我尝试直接实例化我的 Phone 类,它不会接受 int 参数的 null,这是可以理解的,因为它是一个原始类型。

但是,当我使用构建器并且我没有设置 Int 变量的值(将保持为 null)时,导演以某种方式将其值更改为 0。


Phone p=new PhoneBuilder().setOs("Android").setRam(2).getPhone();此时p.Processor == null。 因此,在调用电话构造函数时getPhone()processor的值应该是null我试图用调试器观察变量,但我找不到也不明白为什么它会从null变为0

public class Phone {    
private String os;  
private int ram; 
private String processor;   
private double screenSize;   
private int battery;    
public Phone(String os, int ram, String processor, double screenSize, int battery) {
super();
this.os = os;
this.ram = ram;
this.processor = processor;
this.screenSize = screenSize;
this.battery = battery;
}
}

这是我的构建器:

public class PhoneBuilder {
private String os; 
private int ram; 
private String processor;
private double screenSize;
private int battery; 
public PhoneBuilder setOs(String os) {
this.os = os;
return this;
}
public PhoneBuilder setRam(int ram) {
this.ram = ram;
return this;
//...
public Phone getPhone() {
return new Phone(os, ram, processor, screenSize, battery);
}
}

我没有设置 Int 变量的值(它将保持为空)

不,它不会一直null;它从来没有null过。 对于基元类型,值null是不可能的。

int值设置为0,因为这是 Java 中原始数值的默认值。

JLS 第 4.12.5 节指出:

  • 每个类变量、实例变量或数组组件在创建时都使用默认值进行初始化 (§15.9、§15.10.2):

    • 对于 int 类型,默认值为零,即 0。

    • 对于所有引用类型 (§4.3),默认值为 null。

如果您不想要该值,则可以显式提供不同的默认值,例如:

private int ram = 1;

如果要确保Builder已调用setRam,则可以向生成器类添加一个boolean,将其初始化为false,然后将其设置为setRam中的true。 然后getPhone在构建对象之前检查它是否true,如果它仍然false,则引发异常。

processor变量将被null,因为这是它在生成器中的默认值,Phone构造函数复制该值。

这与任何设计模式无关。 对于基元,不能使用空值,只能对对象使用空值。 一个int,不要与Integer混淆,不能null。 它从来没有null.

所以当你这样说时:

但是当我使用构建器并且我没有设置 Int 变量的值时(它将保持为空)

你做了一个错误的假设。 它没有null,也不会保持null.

下面是一个简单的示例:

public class NoNullForPrimitives{
private static int myInt;
public static void main(String[] args){
System.out.println(myInt); //prints 0
}
}

有关更多详细信息,请参阅"https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 下的默认值部分

相关内容

  • 没有找到相关文章

最新更新