我需要有关 Java 中空安全的建议
I need an advice on null safety in Java
我一直在阅读有关 java 中的空安全的文章,以及 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 的来源。
别人告诉你的时候要小心点"XYZ considered harmful"。我见过人们为了工厂方法(例如 Optional.of(...)
)而完全放弃构造函数,但与所有事情一样,没有唯一的正确答案。
您似乎正在努力尝试实现相互排斥的几件事情(使用简单的代码,在侦听器中只有一个方法,不使用空值)。所以别担心,专注于重要的事情。
如果您的 API 用户是白痴,而且他们不阅读文档,那真的不是您的问题。 Null 不是脏东西;这意味着 "undefined"。令人怀疑的是如果发生意外情况则使用 null,例如 "file not found",理想情况下应该通过异常处理。
如果 "undefined" 是您 API 中未设置值的正确表示,那么使用 null 没有任何问题。
我一直在阅读有关 java 中的空安全的文章,以及 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 的来源。
别人告诉你的时候要小心点"XYZ considered harmful"。我见过人们为了工厂方法(例如 Optional.of(...)
)而完全放弃构造函数,但与所有事情一样,没有唯一的正确答案。
您似乎正在努力尝试实现相互排斥的几件事情(使用简单的代码,在侦听器中只有一个方法,不使用空值)。所以别担心,专注于重要的事情。
如果您的 API 用户是白痴,而且他们不阅读文档,那真的不是您的问题。 Null 不是脏东西;这意味着 "undefined"。令人怀疑的是如果发生意外情况则使用 null,例如 "file not found",理想情况下应该通过异常处理。
如果 "undefined" 是您 API 中未设置值的正确表示,那么使用 null 没有任何问题。