【问题标题】:When to use @Contract("null -> fail") and when to use @NotNull何时使用 @Contract("null -> fail") 以及何时使用 @NotNull
【发布时间】:2015-07-17 09:51:54
【问题描述】:

使用 IntelliJ 注释,可以在方法参数为 null 的情况下以两种不同的方式声明函数失败(并将它们组合在一起,总共三个):

我可以在方法参数上使用@NotNull 注释来声明该参数永远不应该为空。

@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());
}

这三种情况哪一种最好用?

【问题讨论】:

  • 这是@javax.validation.NotNull 吗?
  • 这是@org.jetbrains.annotations.NotNull

标签: java intellij-idea annotations intellij-14


【解决方案1】:

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

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

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

【讨论】:

猜你喜欢
  • 2015-12-17
  • 2012-03-13
  • 2015-01-07
  • 2016-09-23
  • 2021-02-09
  • 2019-08-12
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多