1

如果 getter 返回 null 值,Java 中是否有更简单的方法来创建对象?

例如,在 RoR 中,如果我没记错的话,可能会出现以下情况:

Obj myObj = getObjFromSomewhere() || new Obj();

这会将 myObj 设置为函数返回的对象,如果该对象为空,则设置新的 Obj。

在 Java 中,我发现的最简单的方法是:

Obj myObj = (getObjFromSomewhere() != null ? getObjFromSomewhere() : new Obj());

或者

Obj myObj = getObjFromSomewhere();
if(myObj == null) {
    myObj = new Obj()
}

两者都不太理想,第一个是因为它需要方法调用,这在处理数据库时很糟糕,第二个是因为它笨重。

4

3 回答 3

1

我相信你必须让你的代码更简单:

第一句调用你的方法两次,这是不必要的。第二个选项显然并不笨重,因为您没有其他更简单的方法可以使第一个选项更简单。

如果您觉得需要一遍又一遍地重用此方法,我建议您创建一个实用程序。

public class NotNullUtility {

    private NotNullUtility() {

    }

    public static <T> T select(T value, T defaultValue) {
        if (defaultValue == null)
            throw new IllegalArgumentException("Default value must not be null.");

        if (value == null) {
            return defaultValue;
        }

        return value;
    }   
};

Obj obj = NotNullUtility.select(getObjFromSomewhere(), new Obj());

(这基本上是你的第二个选择)。

于 2013-07-17T21:07:04.870 回答
0

二是正确的做法。我不同意它笨重。它是java,这就是语言语法。

于 2013-07-17T21:02:37.327 回答
0

恕我直言,最优雅的方法是使用 Optional 类。(如果您使用的是 Java 8 或更高版本)。

Obj myObj = Optional.ofNullable(getObjFromSomewhere()).orElse(new Obj())

因此,您有一个单行实现,无需调用 getObjFromSomewhere() 两次或将其分配给变量。

于 2019-04-24T10:37:48.687 回答