在发布了这个问题并阅读了这个问题之后,我意识到知道一个方法是否应该返回 null 或者这是否被认为是错误条件并且应该抛出异常是非常重要的。还有一个很好的讨论何时返回 'null' 或抛出异常。
我正在编写一个方法,并且我已经知道是否要返回 null 或抛出异常,表达我的决定的最佳方式是什么,换句话说,记录我的合同?
我能想到的一些方法:
- 把它写在规格/文档中(有人会读吗?)
- 使其成为方法名称的一部分(正如我在这里建议的那样)
- 假设每个抛出异常的方法都不会返回 null,而每个“不”抛出的方法都可能返回 null。
我主要是在谈论 java,但它也可能适用于其他语言:为什么有一种正式的方式来表达是否会抛出异常(throws
关键字),但没有正式的方式来表达是否可能返回 null?
为什么没有这样的东西:
public notnull Object methodWhichCannotReturnNull(int i) throws Exception
{
return null; // this would lead to a compiler error!
}
总结与结论
合同的表达方式有很多种:
- 如果您的 IDE 支持它(如 IntelliJ),最好使用注释,
@NotNull
因为它对程序员可见并且可用于自动编译时检查。Eclipse有一个插件可以添加对这些的支持,但它对我不起作用。 - 如果这些不是一个选项,请使用类似
Option<T>
or的自定义类型NotNull<T>
,这可以增加清晰度并至少进行运行时检查。 - 无论如何,在 JavaDoc 中记录合同永远不会有害,有时甚至会有所帮助。
- 使用方法名称来记录返回值的可空性不是由我以外的任何人提出的,尽管它可能非常冗长且并不总是有用,但我仍然相信有时它也有其优点。