我一直在阅读关于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的来源。
答案 0 :(得分:4)
当人们告诉你“XYZ被认为有害”时要小心一点。我看到人们完全不使用构造函数来支持工厂方法(例如Optional.of(...)
),但是就像所有事情一样,没有一个正确的答案。
您似乎正在努力尝试实现几个相互排斥的事物(使用简单的代码,只有一个侦听器中的方法,不使用空值)。所以不要担心并专注于重要的事情。
如果您的API用户是白痴,并且他们没有阅读文档,那么这不是您的问题。 Null不是脏东西;它的意思是“未定义”。可疑的是,如果出现意外情况,则使用null,例如“找不到文件”,理想情况下应通过例外处理。
如果“未定义”是API中未设置值的正确表示,则使用null没有任何问题。