多个@EnsuresNonNullIf应该可以;但是编译器抱怨

时间:2019-07-06 07:49:59

标签: java-8 non-nullable java-annotations checker-framework

Checker Framework的手册声称“您可以在一个方法上编写多个@EnsuresNonNullIf批注”,但是,如果尝试这样做,则会观察到以下消息:

token operator:sym<fallback> { . }

Eclipse Java编译器产生的错误消息:

  

不可重复类型@EnsuresNonNullIf的重复注释。只有标记为@Repeatable的注释类型可以在一个目标上多次使用。

MVN javac编译器产生的错误消息:

  

[错误] Blabla.java:[?,?] org.checkerframework.checker.nullness.qual.EnsuresNonNullIf不是可重复的注释类型

我正在注释已有10年历史的代码,所以我希望有一些配置技巧可以确保这一天的安全:-)如果没有多个@EnsuresNonNull,那么我需要大量的手动代码注释来修复误报我对...不感兴趣...

PS:我尝试同时使用checker-framework-2.8.1和2.9.0并获得相似结果,并且始终使用@EnsuresNonNullIf(expression="getFieldNames()", result=true) @EnsuresNonNullIf(expression="getFieldName(i)", result=true) public boolean hasFieldNames() { return fFieldNames != null; }

1 个答案:

答案 0 :(得分:0)

我在Checker Framework问题跟踪器上发现了此问题:https://github.com/typetools/checker-framework/issues/1307

它说明了向以下CF注释添加@Repeatable的“增强”请求:

>  @DefaultQualifier -- DONE
>  @EnsuresKeyFor
>  @EnsuresKeyForIf
>  @EnsuresLockHeldIf
>  @EnsuresLTLengthOf
>  @EnsuresLTLengthOfIf
>  @EnsuresMinLenIf
>  @EnsuresNonNullIf
>  @EnsuresQualifier -- DONE
>  @EnsuresQualifierIf -- DONE
>  @FieldInvariant
>  @GuardSatisfied
>  @HasSubsequence
>  @MethodVal
>  @MinLenFieldInvariant
>  @RequiresQualifier -- DONE
>  @SubstringIndexFor

由于EnsuresQualifiersIf已经是可重复的,因此讨论中包含一种解决方法:

@EnsuresQualifiersIf({
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFoo()"),
    @EnsuresQualifierIf(result=false, qualifier=NonNull.class, expression="getBar()")
})
boolean hasFoo();

在我的情况下,它可以实现:

 @EnsuresQualifiersIf({
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFieldNames()"),
    @EnsuresQualifierIf(result=true, qualifier=NonNull.class, expression="getFieldName(i)")
})
public boolean hasFieldNames() {
    return fFieldNames != null;
}