use*_*551 4 java standards code-analysis nullable non-nullable
这个问题哪个@NotNull的Java注解,我应该使用?是过时的,有点基于意见。从那时起,Java 8 以及更新的 IDE 出现了。
虽然 Java 8 允许通过集成JSR 308进行类型注释,但它没有附带任何注释。来自JSR 308 解释:Josh Juneau 的 Java 类型注释:
JSR 308,Java 类型注解,已作为 Java SE 8 的一部分合并
。...
编译器检查器可以编写来验证注解的代码,通过在代码不满足某些要求时生成编译器警告来强制执行规则。Java SE 8 不提供默认的类型检查框架,但可以编写自定义注解和处理器来进行类型检查。还有很多类型检查框架可以下载,它们可以作为Java编译器的插件来检查和强制执行已经注解的类型。类型检查框架包括类型注释定义和一个或多个与编译器一起用于注释处理的可插拔模块。
仅考虑提供至少某种@CanBeNulland 的解决方案@CannotBeNull,我找到了有关以下内容的信息(可能是错误的):
org.eclipse.jdt.annotation. 其他 IDE 有各自的包。使用 JSR 308,并且仍然支持 Java 8 之前的注释。javax.annotation。使用休眠的JSR 305,它似乎没有使用 Java 8 的类型注释。尽管它没有集成到 Oracle 的 API 中,但出于某种原因它仍然使用javax域,这意味着它确实如此。org.checkerframework.checker.nullness. 使用 JSR 308。javax.validation.constraints. 不知道它有什么用,但@CanBeNull无论如何都没有。有些用于静态代码分析,有些用于运行时验证。
上述选项之间的实际区别是什么?是否有(将要)一个标准,还是打算让每个人编写自己的分析框架?
您收集的信息已经对它进行了大量描述:
基于类型注释 (JSR 308) 的静态分析确实比以前的方法强大得多。
两组注解使用 JSR 308,都是为了执行静态分析(也可以认为是高级类型检查)。从本质上讲,促进这些注释的两个工具本质上是兼容的(并且每个工具也可以使用另一个的注释)。我所知道的差异主要在两个方面:
@NonNullByDefault策略和承认“遗留类型”(为了迁移)之间进行选择。此外,据我所知,目前没有人计划投资于这些注释的标准化。
除了您提到的那些之外,还存在其他一些零性分析;例如,IntelliJ 包含一个nullness analysis。
以下是有关零值分析的一些关键问题:
它在编译时或运行时工作吗?编译时分析为程序员提供关于潜在错误的预先警告。通过运行时分析,您的程序仍然会崩溃,但可能会更早崩溃或带有更多信息性错误消息。
它是验证者还是错误发现者?验证器提供正确性保证:如果工具没有报告任何潜在错误,则程序在运行时不会遇到给定的错误。错误查找器报告了一些问题,但如果它没有报告任何问题,则您的程序可能仍然是错误的。验证器通常需要程序员做更多的工作,包括对程序进行注释。开始使用错误查找器可能需要较少的努力,因为它可以在未注释的程序上运行(尽管在这种情况下它可能不会给出很好的结果)。
分析的精确度如何?当程序实际上正确时,它多久会出现误报或发出警告?它多久会遇到错过的警报,或者没有通知您程序中的真正错误?
该工具是否内置于 IDE 中?如果是这样,它可能更容易使用。如果没有,任何程序员都可以使用它,而不仅仅是使用该特定 IDE 的程序员。
你提到的三个工具都在编译时工作。FindBugs 是一个错误发现者,其他的都是验证者。Checker Framework 具有更好的精度,但其他两个具有更好的 IDE 集成。FindBugs 不适用于 Java 8 类型注释 (JSR 308);其他两个都支持 Java 8 和 Java-8 之前的注释。所有这些工具都在程序员的工具箱中占有一席之地。哪一种适合您取决于您的需求和目标。
回答您的其他一些问题:
FindBugs 的注释使用javax域是因为其设计者希望 Oracle 将 FindBugs 作为 Java 标准(!)。这从来没有发生过。您是对的,使用javax使许多人误以为它是官方的或受到 Oracle 的青睐,而事实并非如此。
是否有(将要)一个标准,还是打算让每个人编写自己的分析框架?
目前,Oracle 希望社区尝试创建和使用各种分析框架。他们觉得他们还没有充分了解各种方法的优缺点,无法创建标准。他们不想过早地制定一个包含有缺陷方法的标准。他们对未来创建标准持开放态度。
| 归档时间: |
|
| 查看次数: |
597 次 |
| 最近记录: |