将参数的可为空性应用于返回值



我有一个方法声明接受并返回null

@CheckForNull
public static String truncate(@CheckForNull text, int maxLength) { ... }

仅当textnull时返回null。当我从标记为@Nonnull的方法传递返回值时,FindBugs无法知道truncate不会返回null,因此如果我将其分配给标记为@Nonnull的字段,则会发出警告。

@Nonnull
public static String trimmedOrEmptyIfNull(@CheckForNull text) { ... }
...
@Nonnull
private String message;
...
message = truncate(trimmedOrEmptyIfNull(e.getMessage()), 100);

这里的警告是假阳性,因为trimmedOrEmptyIfNull被标记为@Nonnull,因此truncate将返回一个非空值,可以推断为@Nonnull本身。

是否有一种方法使FindBugs意识到返回值和参数的可空性之间的这种连接?

我还没有想出解决办法。实现它最困难的部分是理解方法返回值继承的不是 text参数的空性注释,而是传递给它的参数值,在本例中是trimmedOrEmptyIfNull的空性注释。以下是一些想法:

  • 添加一个新的参数注释来代替现有的注释。这并不清楚它是否适用于方法的返回值,也不容易检查方法体。

    参数是否标记为@CheckForNull ?
    public static String truncate(@InheritNullness text, int maxLength) { ... }
    
  • 为新方法注释添加参数。这也不清楚调用代码传递的参数的可空性是继承的。

    @Nullability(inherit = "text")
    public static String truncate(@CheckForNull text, int maxLength) { ... }
    
  • 由于99%的情况可能涉及用@Nonnull覆盖@CheckForNull@Nullable注释(这是一个合理的假设吗?),因此除了现有注释之外,还可以添加一个新的参数注释来使用。这并不清楚它是否适用于方法的返回值,也不容易检查方法体。

    参数是否标记为@CheckForNull ?
    @CheckForNull
    public static String truncate(@InheritNonnull text, int maxLength) { ... }
    

我必须承认我不喜欢他们中的任何一个。(

最新更新