如何处理以null初始化的构造函数?

时间:2018-10-28 01:33:12

标签: java constructor java-8

让有一个类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的情况的最佳方法是什么?

2 个答案:

答案 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的字段,或者如果这真的无效,则抛出异常。