java - 使用 ErrorProne 强制执行类型注释?

标签 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
}

最佳答案

Error Prone 有一组硬编码的检查。您可以扩展 Error Prone,但这需要 fork 它、编辑源代码、重建它并使用您自己的自定义版本。

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 框架还会针对赋值 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 {}

关于java - 使用 ErrorProne 强制执行类型注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56466885/

相关文章:

java - 在 Java 中复制和创建文件

java - 在 Android 上将 GeoFire 与 Firebase 结合使用,但找不到 DatabaseReference 类

java - 从 Guava 19 升级到 20 时出现编译错误

java - 解决调用其他构造函数的构造函数上容易出错的 ConstructorLeaksThis 警告

java - 如何在 Android 中实现基于距离的类似 tinder 的搜索?

java - 字符串 replaceAll 方法 (Java)

java - 使用 Java Checker Framework 的 Nullness Checker 注释可重入性

Java collect 方法与 Checker 框架不兼容

java - 将 Gradle 依赖项的路径传递给 Java 编译器

java - 如何排除容易出错的单元测试?