让有一个类A
。类B
如下:
public class B {
private int anInt;
private String aString;
...
public B(A initObj) {
anInt = initObj.getIntField();
aString = initObj.getStringField();
...
}
...
}
如果initObj为null
,则最有意义的是B
对象也为null。但是,according to the internet是Java构造函数无法返回null。
很显然,最好检查正在调用B
的构造函数的代码,以免不使用null参数调用构造函数。但是,假设发生这种可能性,最好的办法是妥善处理这种情况。
处理用B
初始化null
的情况的最佳方法是什么?
答案 0 :(得分:1)
一种实现方法是在构造函数中使用Objects.requireNonNull(initObj)
。如果A实例为NullPointerException
,则会抛出null
。
public B(A initObj) {
Objects.requireNonNull(initObj);
anInt = initObj.getIntField();
aString = initObj.getStringField();
}
或者,如果您真的需要在A为null时返回null,则可以改用静态工厂。这是实际的样子。
public static Optional<B> createB(A initObj) {
if (initObj == null)
return Optional.empty();
return Optional.of(new B(initObj));
}
请注意,返回Optional
会给您的客户一种印象,即您的方法返回的值可能为null,需要明确处理该情况。
答案 1 :(得分:0)
根据您想要在应用程序中发生什么,您有几种选择。 您可以将B构造函数的签名更改为采用int和String参数而不是A。这样,调用方必须处理可能为null的initObj,而B不必处理构造函数中可能为null的参数。 构造函数还可以对initObj执行null检查,或者如果这是B的有效状态,则不初始化B的字段,或者如果这真的无效,则抛出异常。