【发布时间】:2010-09-29 12:19:48
【问题描述】:
在发布this question 并阅读that one 之后,我意识到知道一个方法是否应该返回null 或者这是否被认为是错误条件并且应该抛出异常是非常重要的。 return ‘null’ or throw exception 时也有很好的讨论。
我正在编写一个方法,并且我已经知道是否要返回 null 或抛出异常,表达我的决定的最佳方式是什么,换句话说,记录我的合同?
我能想到的一些方法:
- 在规范/文档中写下来(有人会读吗?)
- 让它成为方法名称的一部分(正如我建议的here)
- 假设每个抛出异常的方法都不返回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这样的注解,因为它对程序员可见并且可用于自动编译时检查。有一个 plugin for Eclipse 可以添加对这些的支持,但它对我不起作用。 - 如果这些不是一个选项,请使用
Option<T>或NotNull<T>等自定义类型,这样可以增加清晰度并至少进行运行时检查。 - 无论如何,在 JavaDoc 中记录合同永远不会有害,有时甚至会有所帮助。
- 使用方法名称来记录返回值的可空性不是由我以外的任何人提出的,虽然它可能非常冗长且并不总是有用,但我仍然相信有时它有其优势,也是。
【问题讨论】:
标签: java null design-by-contract