有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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的一部分

*只是一个用于演示目的的虚构类:)实际代码使用更复杂的类


共 (2) 个答案

  1. # 1 楼答案

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

    public boolean isNullOrEmpty(String pString) {}
    
  2. # 2 楼答案

    因为你用@Nullable注释了mString,所以mString很可能是null。这是工作中的静态分析;您已经声明该字段可能是也可能不是^{,因此IntelliJ将通知您这一点

    考虑为什么字段用^ {CD2>}注释。也许应该是@NotNull

    请记住,我只在contains方法中得到警告,因为IntelliJ正在做聪明的事情;它知道如果mString == null,那么另一个条件将不会被评估

    提醒一下:@Contractonly applies to the arguments。它不会检查与字段有关的任何内容,这就是为什么人们会对字段进行不同的注释(使用@Nullable@NonNull@MagicConstant,等等)