使用ErrorProne强制类型注释?

时间:2019-06-05 19:32:48

标签: java checker-framework errorprone

是否有使用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
}

1 个答案:

答案 0 :(得分:2)

容易出错,具有一组硬编码的检查。您可以扩展容易出错的功能,但这需要对其进行分叉,编辑源代码,重建它并使用自己的自定义版本。

Checker Framework是可插入的类型检查器,用于检查类型注释。 它符合您的目的。

假设您定义了@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"发出警告,因为它无法知道该作业是合法的。如果您是{确定是合法的。)

为完整起见,以下是注释定义:

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 {}