MyK*_*ey_ 3 java annotations checker-framework retention
Java 8类型注释(JSR 308)允许类型检查器执行静态代码分析。例如,Checker Framework可以通过注释检查可能的无效性@NonNull。
各种项目定义了自己的NonNull注释,例如:
org.checkerframework.checker.nullness.qual.NonNulledu.umd.cs.findbugs.annotations.NonNulljavax.annotation.Nonnulljavax.validation.constraints.NotNulllombok.NonNullorg.eclipse.jdt.annotation.NonNull对于此类注释,我希望它@interface具有@Retention(RetentionPolicy.CLASS),因为在运行时通常不需要它们。最重要的是,代码在相应的库上没有任何运行时依赖项。
虽然org.eclipse.jdt.annotation.NonNull采用这种方法,但其他大多数NonNull注释(如javax.annotation.Nonnull(JSR 305)及其org.checkerframework.checker.nullness.qual.NonNull本身)也具有@Retention(RetentionPolicy.RUNTIME)。RetentionPolicy.RUNTIME这些注释中是否有任何特殊原因?
澄清:Checker Framework支持注释中的注释,以实现向后兼容。但是,在Java 8中使用它们只是为了避免运行时依赖性,这似乎是一个肮脏的技巧。
这是一个很好的问题。
为了在编译时进行静态检查,CLASS保留就足够了。请注意SOURCE,由于单独的编译,保留是不够的:对类进行类型检查时,编译器需要读取其使用的库的批注,并且单独编译的库仅作为类文件可供编译器使用。
注释设计者使用RUNTIME保留来允许工具执行运行时操作。这可能包括检查注释(如assert语句),动态加载的代码的类型检查,强制类型转换和instanceof操作的检查,更精确地解决反射等等。如今,这类工具还不多,但是注释设计人员希望将来能够使用它们。
您使用标记为@Retention(RetentionPolicy.CLASS)“代码在相应的库上没有任何运行时依赖项”。实际上@Retention(RetentionPolicy.RUNTIME),也是如此!请参见以下堆栈溢出问题:
为什么缺少的注释在运行时不会导致ClassNotFoundException?。
总而言之,使用CLASS保留在运行时花费的空间可忽略不计,将来有更多潜在用途,并且不会引入运行时依赖性。
对于Checker Framework,它提供了诸如的运行时测试isRegex(String)。如果您的代码使用此类方法,则您的代码将依赖于Checker Framework运行时库(该库小于整个Checker Framework本身)。
| 归档时间: |
|
| 查看次数: |
503 次 |
| 最近记录: |