何时使用@Contract(“null - > fail”)以及何时使用@NotNull

时间:2015-07-17 09:51:55

标签: java intellij-idea annotations intellij-14

使用IntelliJ注释,如果方法参数以两种不同的方式为空(并组合它们,总共三个),则可以声明函数失败:

我可以在method参数上使用@NotNull注释来声明参数永远不应为null。

@NotNull
public static String doSomething(@NotNull CharSequence parameter) throws NullPointerException {
    return String.format("This is the value: %s, of type %s",
            Objects.requireNonNull(parameter),
            parameter.getClass().getName());
}

或者,我可以使用@Contract("null -> fail")注释,它声明如果第一个参数为null,该方法将抛出异常。

@NotNull
@Contract("null -> fail")
public static String doSomething(CharSequence parameter) throws NullPointerException {
    return String.format("This is the value: %s, of type %s",
            Objects.requireNonNull(parameter),
            parameter.getClass().getName());
}

最后,我甚至可以在我的IntelliJ IDEA 14.1.4中使用两者并且没有任何内容抱怨:

@NotNull
@Contract("null -> fail")
public static String doSomething(@NotNull CharSequence parameter) throws NullPointerException {
    return String.format("This is the value: %s, of type %s",
            Objects.requireNonNull(parameter),
            parameter.getClass().getName());
}

最好使用这三种情况中的哪一种?

1 个答案:

答案 0 :(得分:2)

在你的情况下,我会使用@NotNull,因为:

  • 这是一个更具体的注释,IDEA能够根据它生成更具体的警告
  • IDEA可以生成运行时断言,确保它真的不为空

@Contract注释是一个功能更强大但不太具体的工具。它允许您表达更复杂的合同,其缺点是生成的编辑器警告可能更加模糊,并且不会自动添加运行时检查。