使用 ErrorProne 强制执行类型注释?
Using ErrorProne to enforce a type annotation?
是否有使用 ErrorProne 对类型和参数强制执行注释的示例?
例如,
@EventKey private static final String VALID_KEY = "asdf";
Map<@EventKey String, Object> map = new HashMap<>();
public void addSomeValues() {
map.put("invalid_key", new Object()); // should error
map.put(VALID_KEY, new Object()); // should pass
}
public void put(@EventKey String key, Object value) {
map.put(key, value);
}
public void usingCustomPut(){
put("invalid_key", new Object()); // should error
put(VALID_KEY, new Object()); // should pass
}
Error Prone 有一组 hard-coded 检查。您可以扩展 Error Prone,但这需要分叉它、编辑源代码、重建它并使用您自己的自定义版本。
Checker Framework 是一个可插入的 type-checker 设计用于检查类型注释。
它符合您的目的。
假设您定义了 @EventKey
注释,如下所示。 (这遵循 creating a new checker 的说明。)
然后你可以运行命令
java -jar "${CHECKERFRAMEWORK}/checker/dist/checker.jar" -cp . \
-processor org.checkerframework.common.subtyping.SubtypingChecker \
-Aquals=UnknownEventKey,EventKey TestCase.java
它的行为完全符合您的意愿,允许正确的行并禁止不正确的行(通过编译器错误消息)。
(一个警告:Checker Framework 还会对分配 VALID_KEY = "asdf"
发出警告,因为它无法知道该分配是否合法。您可以 suppress 该警告,如果你确定这是合法的。)
为了完整起见,下面是注释定义:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import org.checkerframework.framework.qual.DefaultQualifierInHierarchy;
import org.checkerframework.framework.qual.SubtypeOf;
/** The value might or might not be an Event Key. */
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf({})
@DefaultQualifierInHierarchy
public @interface UnknownEventKey {}
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import org.checkerframework.framework.qual.ImplicitFor;
import org.checkerframework.framework.qual.LiteralKind;
import org.checkerframework.framework.qual.SubtypeOf;
/** The value is an Event Key. */
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf({UnknownEventKey.class})
@ImplicitFor(literals = LiteralKind.NULL)
public @interface EventKey {}
是否有使用 ErrorProne 对类型和参数强制执行注释的示例?
例如,
@EventKey private static final String VALID_KEY = "asdf";
Map<@EventKey String, Object> map = new HashMap<>();
public void addSomeValues() {
map.put("invalid_key", new Object()); // should error
map.put(VALID_KEY, new Object()); // should pass
}
public void put(@EventKey String key, Object value) {
map.put(key, value);
}
public void usingCustomPut(){
put("invalid_key", new Object()); // should error
put(VALID_KEY, new Object()); // should pass
}
Error Prone 有一组 hard-coded 检查。您可以扩展 Error Prone,但这需要分叉它、编辑源代码、重建它并使用您自己的自定义版本。
Checker Framework 是一个可插入的 type-checker 设计用于检查类型注释。 它符合您的目的。
假设您定义了 @EventKey
注释,如下所示。 (这遵循 creating a new checker 的说明。)
然后你可以运行命令
java -jar "${CHECKERFRAMEWORK}/checker/dist/checker.jar" -cp . \
-processor org.checkerframework.common.subtyping.SubtypingChecker \
-Aquals=UnknownEventKey,EventKey TestCase.java
它的行为完全符合您的意愿,允许正确的行并禁止不正确的行(通过编译器错误消息)。
(一个警告:Checker Framework 还会对分配 VALID_KEY = "asdf"
发出警告,因为它无法知道该分配是否合法。您可以 suppress 该警告,如果你确定这是合法的。)
为了完整起见,下面是注释定义:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import org.checkerframework.framework.qual.DefaultQualifierInHierarchy;
import org.checkerframework.framework.qual.SubtypeOf;
/** The value might or might not be an Event Key. */
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf({})
@DefaultQualifierInHierarchy
public @interface UnknownEventKey {}
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import org.checkerframework.framework.qual.ImplicitFor;
import org.checkerframework.framework.qual.LiteralKind;
import org.checkerframework.framework.qual.SubtypeOf;
/** The value is an Event Key. */
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf({UnknownEventKey.class})
@ImplicitFor(literals = LiteralKind.NULL)
public @interface EventKey {}