2

我一直在阅读有关在 java 中实现 null 安全的文章,以及作为参数return null传递的 . null我知道它简化了生活,而且人们并不总是阅读文档,所以他们不知道方法是否可以传递给它return null,或者是否null可以传递给它。注解似乎只是污染了代码,并且没有类似 Kotlin 的null 安全机制。在我当前的项目中,我尝试以这样的方式设计所有东西,null 几乎是不必要的,至少对于最终用户来说是这样。

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

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,并让用户找到所有 NullPointerExceptions 的来源。

4

1 回答 1

4

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

您似乎正在努力尝试实现互斥的几件事(使用简单的代码,在侦听器中只有一种方法,不使用空值)。所以不要再担心了,把注意力集中在重要的事情上。

如果您的 API 用户是白痴,并且他们不阅读文档,那并不是您的问题。Null 不是脏东西;它的意思是“未定义”。值得怀疑的是,如果发生意外情况,例如“找不到文件”,则使用 null ,理想情况下应该通过异常处理。

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

于 2018-01-12T15:16:43.213 回答