java JetBrains@Contract using字段
我有以下课程*:
public class MyClass {
@Nullable
private String mString;
/* ... */
public boolean contains(@NotNull final String text) {
if(!isNullOrEmpty()) {
return mString.contains(text);
} else {
return false;
}
}
public boolean isNullOrEmpty() {
return mString == null || mString.isEmpty();
}
}
现在在mString.contains(text)
,IntelliJ警告我mString
可能是null
,尽管它保证不是。我注意到JetBrains有^{isNullOrEmpty()
进行注释,这样当方法返回true
时,我就不会收到这个警告
我希望@Contract
注释将接近Java Modeling Language功能,如下所示:
//@ ensure \result == true ==> mString != null;
public boolean isNullOrEmpty() {
return mString == null || mString.isEmpty();
}
此外,我希望isNullOrEmpty()
保持无参数,因为它是公共API的一部分
*只是一个用于演示目的的虚构类:)实际代码使用更复杂的类
# 1 楼答案
您的
mString
是可变的,因此可以在检查“isNullOrEmpty
”和访问“mString.contains
”mString值之间进行更改。这就是为什么@Contract
注释只适用于方法参数的原因。如果您的方法isNullOrEmpty
如下所示,则可以使用@Contract
:# 2 楼答案
因为你用,因此IntelliJ将通知您这一点
@Nullable
注释了mString
,所以mString
很可能是null
。这是工作中的静态分析;您已经声明该字段可能是也可能不是^{考虑为什么字段用^ {CD2>}注释。也许应该是
@NotNull
请记住,我只在
contains
方法中得到警告,因为IntelliJ正在做聪明的事情;它知道如果mString == null
,那么另一个条件将不会被评估提醒一下:
@Contract
only applies to the arguments。它不会检查与字段有关的任何内容,这就是为什么人们会对字段进行不同的注释(使用@Nullable
、@NonNull
、@MagicConstant
,等等)