我需要关于Java

时间:2018-01-12 15:00:23

标签: java null kotlin-null-safety

我一直在阅读关于java中的null安全的文章,以及return null或者那个罪的错误,即将null作为参数传递。我知道它简化了生活,人们不会总是阅读文档,所以他们不知道方法可以return null,或者null是否可以传递给它。注释似乎只是污染代码,并且没有类似Kotlin的null safety机制。在我当前的项目中,我尝试以这种方式设计所有内容,几乎不需要null,至少对于最终用户来说。

我想创建一个更改侦听器(类似javafx.beans.value.ChangeListener),这样我就可以将前一个值和当前值传递给changed()方法。问题是,我希望它是null安全的,所以我不想传递null作为参数,即使它可以从无值变为某个值,或从某个值变为没有价值。我可以为这种情况添加两个额外的方法,例如:

public inteface ChangeListener<T> {
    void valueSet(T current);
    void valueChanged(T previous, T current);
    void valueCleared(T previous);
}

这种做法似乎过分了。我也可以用 java.util.Optional<T>作为参数,但增加了额外的装箱:

public inteface ChangeListener<T> {
    void changed(Optional<T> previous, Optional<T> current);
}

有更优雅的选择吗?或者我应该强迫用户使用某种Null Object Pattern?虽然这会产生扩展某些类的需要的问题。我也可以停止关怀,在文档中指定如果使用null将会发生什么,并让用户找到所有NullPointerExceptions的来源。

1 个答案:

答案 0 :(得分:4)

当人们告诉你“XYZ被认为有害”时要小心一点。我看到人们完全不使用构造函数来支持工厂方法(例如Optional.of(...)),但是就像所有事情一样,没有一个正确的答案。

您似乎正在努力尝试实现几个相互排斥的事物(使用简单的代码,只有一个侦听器中的方法,不使用空值)。所以不要担心并专注于重要的事情。

如果您的API用户是白痴,并且他们没有阅读文档,那么这不是您的问题。 Null不是脏东西;它的意思是“未定义”。可疑的是,如果出现意外情况,则使用null,例如“找不到文件”,理想情况下应通过例外处理。

如果“未定义”是API中未设置值的正确表示,则使用null没有任何问题。