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;
}
答案 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;
}