I've got the following class*:
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();
  }
}
Now at mString.contains(text), IntelliJ warns me that mString might be null, even though it is guaranteed that it isn't. I've noticed JetBrains has the @Contract annotation. Is there a way I can annotate isNullOrEmpty() in such a way that I don't get this warning when the method returns true?
I am hoping the @Contract annotation will come close to the Java Modeling Language functionality, like so:
//@ ensure \result == true ==> mString != null;
public boolean isNullOrEmpty() {
  return mString == null || mString.isEmpty();
}
Furthermore, I'd like isNullOrEmpty() to remain parameterless, since it is part of the public API.
*Just a fictional class for demonstration purposes :) The actual code uses a more complex class.
Your mString is mutable so between the check 'isNullOrEmpty' and the access 'mString.contains' mString value can be changed. So it is the reason why @Contract annotation works only for method parameters. You can use @Contract if your method isNullOrEmpty looks like:
public boolean isNullOrEmpty(String pString) {}
                        Well, because you've annotated mString with @Nullable, mString could very well be null.  This is static analysis at work; you've already declared that this field may or may not be null, so IntelliJ is going to inform you about that.
Consider why the field is annotated with @Nullable.  Maybe it should be @NotNull?
Keep in mind, I'm only getting the warning in the contains method, since IntelliJ is doing the smart thing; it knows that if mString == null, the other condition won't be evaluated.
As a reminder:  @Contract only applies to the arguments.  It won't check anything to do with the fields, which is why one would annotate the fields differently (with @Nullable, @NonNull, @MagicConstant, etc.).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With