Java 8 类型注释 (JSR 308) 允许类型检查器执行静态代码分析。例如,检查器框架 https://checkerframework.org/可以检查是否有可能nullness via @NonNull
注释。
不同的项目定义了自己的NonNull注释,例如:
org.checkerframework.checker.nullness.qual.NonNull
edu.umd.cs.findbugs.annotations.NonNull
javax.annotation.Nonnull
javax.validation.constraints.NotNull
lombok.NonNull
org.eclipse.jdt.annotation.NonNull
- 等等(参见Checker 框架手册,第 3.7 节 https://checkerframework.org/manual/#nullness-related-work)
对于这样的注释,我希望@interface
具有@Retention(RetentionPolicy.CLASS) https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/RetentionPolicy.html#CLASS,因为它们通常在运行时不需要。最重要的是,代码对相应库没有任何运行时依赖性。
While org.eclipse.jdt.annotation.NonNull http://help.eclipse.org/neon/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/annotation/NonNull.html遵循这种方法,大多数其他NonNull注释,例如javax.annotation.Nonnull
(JSR 305)和org.checkerframework.checker.nullness.qual.NonNull https://checkerframework.org/api/org/checkerframework/checker/nullness/qual/NonNull.html本身,有@Retention(RetentionPolicy.RUNTIME) https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/RetentionPolicy.html#RUNTIME。有什么特别的原因吗RetentionPolicy.RUNTIME
在这些注释中?
澄清:Checker 框架支持注释中的注释以实现向后兼容性。然而,在 Java 8 中使用这些只是为了避免运行时依赖似乎是一种肮脏的黑客行为。
这是一个很好的问题。
为了在编译时进行静态检查,CLASS
保留就足够了。注意SOURCE
由于单独编译,保留还不够:在对类进行类型检查时,编译器需要读取其使用的库的注释,并且单独编译的库只能作为类文件提供给编译器。
注释设计者使用的RUNTIME
保留以允许工具执行运行时操作。这可能包括检查注释(如断言语句)、动态加载代码的类型检查、强制转换检查和instanceof
操作,更精确地解决反射等等。目前这样的工具并不多,但注释设计者希望将来能够容纳它们。
你说的是@Retention(RetentionPolicy.CLASS)
,“代码对相应库没有任何运行时依赖性。”这实际上是正确的@Retention(RetentionPolicy.RUNTIME)
, 也!请参阅这个堆栈溢出问题:为什么缺少注释不会在运行时导致 ClassNotFoundException? https://stackoverflow.com/questions/3567413/why-doesnt-a-missing-annotation-cause-a-classnotfoundexception-at-runtime .
总之,使用CLASS
保留在运行时占用的空间量可以忽略不计,可以在将来实现更多潜在用途,并且不会引入运行时依赖性。
对于 Checker 框架,它提供运行时测试,例如isRegex(String) https://checkerframework.org/api/org/checkerframework/checker/regex/RegexUtil.html#isRegex-java.lang.String-。如果您的代码使用此类方法,您的代码将依赖于 Checker Framework 运行时库(该库比整个 Checker Framework 本身小,并且具有更宽松的许可证)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)