如何显示方法是否可能返回 null

2022-08-31 21:03:38

在发布这个问题并阅读了这个问题之后,我意识到知道一个方法是否应该返回null非常重要,或者这是否被认为是一个错误条件,并且应该引发异常。还有一个很好的讨论,何时返回“null”或抛出异常

我正在编写一个方法,并且我已经知道我是否要返回 null 或引发异常,表达我的决定的最佳方式是什么,换句话说,记录我的合约?

我能想到的一些方法:

  • 把它写在规格/文档中(有人会读它吗?
  • 使其成为方法名称的一部分(正如我在此处建议的那样))
  • 假设每个引发异常的方法都不会返回 null,并且每个不“不”引发的方法都可能返回 null。

我主要在谈论java,但它也可能适用于其他语言:为什么有一种正式的方法来表达是否会抛出异常(关键字),但没有正式的方式来表达是否可以返回null?throws

为什么没有这样的东西:

public notnull Object methodWhichCannotReturnNull(int i) throws Exception
{
    return null; // this would lead to a compiler error!
}

总结和结论

表达合同的方式有很多种:

  • 如果您的IDE支持它(如IntelliJ),则最好使用这样的注释,因为它对程序员是可见的,并且可以用于自动编译时检查。Eclipse有一个插件可以添加对这些的支持,但它对我不起作用。@NotNull
  • 如果这些不是一个选项,请使用自定义类型,如 或 ,这增加了清晰度,至少增加了运行时检查。Option<T>NotNull<T>
  • 无论如何,在JavaDoc中记录合同永远不会受到伤害,有时甚至会有所帮助。
  • 使用方法名称来记录返回值的可空性不是由任何人提出的,除了我之外,没有人提出,尽管它可能非常冗长并且并不总是有用,但我仍然相信有时它也有其优点。

答案 1

一个非常好的后续问题。我认为一个真正特殊的值,如果一个方法可能返回,它必须清楚地记录在Javadoc中,当它这样做时()。在编码时,我是防御性的,并假设一个方法可能会返回,除非我确信它不能(例如,因为Javadoc是这么说的)。nullnull@return some value ..., or null if ...null

人们意识到这是一个问题,建议的解决方案是使用注释以一种可以自动检查的方式陈述意图。请参阅 JSR 305:软件缺陷检测的注释JSR 308:Java 类型的注释JetBrain 的 Nullable How-To

您的示例可能如下所示,但被 IDE、编译器或其他代码分析工具拒绝。

@NotNull
public Object methodWhichCannotReturnNull(int i) throws Exception
{
    return null; // this would lead to a compiler error!
}

答案 2

您可以使用 Option 类型,它非常类似于具有零个或一个元素的列表。返回类型 指示该方法可能返回 ,或者它可能返回类型为 的特殊值。此类型替代了使用 null 和更好的类型检查。Option<Object>ObjectNone

例:

public Option<Integer> parseInt(String s) {
   try {
      return Option.some(Integer.parseInt(s));
   }
   catch (Exception e) {
      return Option.none();
   }
}

如果一致地使用它,则可以打开 IDE 空值警告,或者只使用 grep,如果您使用通常使用文本的任何地方,则根本不应该出现在代码中。nullOption.none()null

Option标配 Scala,在 Haskell 中称为 Scala。上面的链接指向一个名为Funical Java的库,其中包含它。该版本实现了接口,并具有一元方法,可让您很好地编写内容。例如,在以下情况下提供默认值 0:MaybeIterableNone

int x = optionalInt.orSome(0);

你可以替换这个...

if (myString != null && !"".equals(myString))

...有了这个,如果你有一个...Option<String>

for (String s : myOptionString)