发布
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添加对这些的支持,但它没有为我工作。
>如果这些不是选项,请使用自定义类型,如选项< T>或NotNull T,这增加了清晰度和至少运行时检查。
>无论如何,在JavaDoc中记录合同从不伤害,有时甚至有帮助。
>使用方法名来记录返回值的可空性不是由任何人提出的,虽然它可能很冗长,并不总是有用,但我仍然相信有时它也有它的优势。