我应该使用哪个@NotNull Java注释?这个问题已经过时了,而且有点基于观点。从那时起,Java 8和更新的IDE一起出现了。
虽然Java 8允许通过集成JSR 308来进行类型注释,但它没有附带任何注释。来自JSR 308解释:由Josh Juneau编写的Java类型注释
JSR 308是关于Java类型的注释,它被合并为Java 8的一部分。 ..。 可以编写编译器检查程序来验证带注释的代码,在代码不满足某些要求时通过生成编译器警告来强制执行规则。Java 8没有提供默认的类型检查框架,但是可以为类型检查编写自定义注释和处理器。还有许多类型检查框架可以下载,这些框架可以作为Java编译器的插件来检查和执行已注释过的类型。类型检查框架包括类型注释定义和一个或多个可插入模块,这些模块与编译器一起用于注释处理。
考虑到只提供某种@CanBeNull和@CannotBeNull的解决方案,我发现了以下信息(可能是错误的):
org.eclipse.jdt.annotation。其他IDE有各自的软件包。使用JSR 308,而且仍然支持Java8之前的注释。javax.annotation。使用休眠的JSR 305,它似乎没有使用Java8的类型注释。尽管它没有集成到Oracle中,但出于某种原因,它仍然使用javax域,这意味着它使用了javax域。org.checkerframework.checker.nullness.使用JSR 308。javax.validation.constraints。不知道它使用什么,但无论如何都没有@CanBeNull。有些用于静态代码分析,有些用于运行时验证。
上述方案之间的实际区别是什么?是否有(将要制定)一个标准,还是每个人都要编写自己的分析框架?
发布于 2016-08-26 12:44:30
除了前面提到的分析之外,还存在一些其他的空分析;例如,IntelliJ包含一个空度分析。
以下是关于无空分析的一些关键问题:
您提到的三个工具都是在编译时工作的。FindBugs是一个bug查找器,其他是验证器。Checker具有更好的精度,但其他两个具有更好的IDE集成。FindBugs不适用于Java8类型注释(JSR 308);其他两种注释都支持Java8和Java-8之前的注释。所有这些工具都有它们在程序员工具箱中的位置;哪个工具适合您,取决于您的需求和目标。
来回答你的其他问题:
FindBugs的注释使用javax域,因为它的设计者希望FindBugs作为一个Java标准(!)。从来没发生过。您是对的,javax的使用使许多人感到困惑,认为它是官方的或受甲骨文青睐的,但事实并非如此。
是否有(将要制定)一个标准,还是每个人都要编写自己的分析框架?
目前,Oracle希望社区能够尝试创建和使用各种分析框架。他们认为,他们还没有充分了解各种方法的利弊,无法创建一个标准。他们不想过早地创造一种标准来体现一种有缺陷的方法。他们愿意在未来制定一个标准。
发布于 2016-08-26 12:16:23
你收集到的信息已经描述了这一点:
基于类型注释(JSR 308)的静态分析确实比以前的方法强大得多。
两组注释使用JSR 308,都是为了执行静态分析(也可以被认为是高级类型检查)。在核心部分,促进这些注释的两个工具本质上是兼容的(而且每个工具也可以使用另一个的注释)。据我所知,差异主要体现在两个方面:
@NonNullByDefault策略和承认“遗留类型”(为了迁移)之间进行选择。而且,据我所知,目前没有人打算投资于这些注释的标准化。
https://stackoverflow.com/questions/39151954
复制相似问题