JetBrains @Contract使用字段

nha*_*man 4 java intellij-idea

我有以下课程*:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在mString.contains(text),IntelliJ警告我mString可能null,即使它确保不是.我注意到JetBrains有@Contract注释.有没有办法我可以这样注释isNullOrEmpty(),当方法返回时我没有得到这个警告true

我希望@Contract注释能够接近Java Modeling Language功能,如下所示:

//@ ensure \result == true ==> mString != null;
public boolean isNullOrEmpty() {
  return mString == null || mString.isEmpty();
}
Run Code Online (Sandbox Code Playgroud)

此外,我想isNullOrEmpty()保持无参数,因为它是公共API的一部分.

*仅用于演示目的的虚构类:)实际代码使用更复杂的类.

ans*_*oyt 7

mString是可变的,所以在检查' isNullOrEmpty'和访问' 之间' mString.contains'mString值可以改变.因此,这就是为什么@Contract注释仅适用于方法参数的原因.@Contract如果您的方法isNullOrEmpty如下,则可以使用:

public isNullOrEmpty(String pString) {}
Run Code Online (Sandbox Code Playgroud)