首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ErrorProne强制执行类型批注?

使用ErrorProne强制执行类型批注?
EN

Stack Overflow用户
提问于 2019-06-06 03:32:48
回答 1查看 96关注 0票数 1

有没有使用ErrorProne在类型和参数上强制注解的示例?

例如,

代码语言:javascript
复制
@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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-13 05:47:20

Error Prone有一组硬编码的检查。您可以扩展错误倾向,但这将需要派生它,编辑源代码,重新构建它,并使用您自己的自定义版本。

Checker Framework是一个可插拔的类型检查器,用于检查类型注释。它服务于你的目的。

假设您定义了@EventKey注释,如下所示。(这是按照creating a new checker的说明进行的。)

然后,您可以运行该命令

代码语言:javascript
复制
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该警告。)

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

代码语言:javascript
复制
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 {}
代码语言:javascript
复制
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 {}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56466885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档