我需要关于Java中的null安全性的建议

我一直在阅读关于java中的beeing null safe的文章,以及如何return null或那个传递null作为参数的错误。 我得到它简化了生活,人们并不总是阅读文档,所以他们不知道方法可以return null ,或者如果null可以传递给它。 注释似乎只是污染了代码,并没有像Kotlin一样的无效安全机制。 在我目前的项目中,我尝试以这种方式设计所有的东西,至少对于最终用户来说几乎是不需要的。

我想创建一个更改监听器(类似javafx.beans.value.ChangeListener ),以便我可以传递一个以前和当前值的changed()方法。 事情是,我希望它是无效的,所以我不想永远传递一个null作为参数,即使它可以从无值改变到某个值,或者从某个值改变为无值。 我可以为这种情况添加两个额外的方法,并有类似的东西:

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

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

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

有更优雅的选择吗? 还是应该强制用户使用某种空对象模式 ? 虽然这会造成需要扩展一些类的问题。 我也可以停止关心,在文档中指定如果使用null ,会发生什么情况,并让用户find所有NullPointerExceptions的来源。

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

你似乎正努力尝试实现几个相互排斥的东西(使用简单的代码,在侦听器中只有一个方法,不使用空值)。 所以,不要担心,重点放在重要的事情上。

如果你的API用户是白痴,他们不阅读文档,这不是你的问题。 空不是脏的; 这意味着“未定义”。 可疑的是,如果发生意外事件时使用null,比如“找不到文件”,理想情况下应该通过exception来处理。

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