null分析注释包之间有什么区别?

时间:2016-08-25 18:00:51

标签: java standards code-analysis nullable non-nullable

Which @NotNull Java annotation should I use?这个问题已经过时,而且基于意见。从那时起,Java 8与更新的IDE一起出现。

虽然Java 8通过JSR 308的集成允许类型注释,但它没有附带任何内容。来自JSR 308 Explained: Java Type Annotations by Josh Juneau

  

JSR 308,Java类型的注释,已作为Java SE 8的一部分合并   ...
  可以编写编译器检查程序来验证带注释的代码,通过在代码不满足某些要求时生成编译器警告来强制执行规则。 Java SE 8不提供默认的类型检查框架,但可以编写自定义注释和处理器以进行类型检查。还可以下载许多类型检查框架,这些框架可以用作Java编译器的插件,以检查和实施已注释的类型。类型检查框架包括类型注释定义和一个或多个可插入模块,这些模块与编译器一起用于注释处理。

仅考虑至少提供某种@CanBeNull@CannotBeNull的解决方案,我发现以下信息(可能是错误的):

一些用于静态代码分析,一些用于运行时验证。

上述选项之间有何实际差异?是(会)是一个标准,还是每个人都想编写自己的分析框架?

2 个答案:

答案 0 :(得分:4)

您收集的信息几乎已经描述了它:

基于类型注释的静态分析(JSR 308)确实比以前的方法更强大。

两组注释使用JSR 308,两者都是为了执行静态分析(也可以认为是高级类型检查)。在核心,促进这些注释的两个工具基本上是兼容的(并且每个工具也可以使用另一个的注释)。 我所知道的差异主要在两个方面:

  • IDE集成。
  • 未注释类型的解释。在严格的世界中,每个类型都是非空的或可空的,因此如果缺少注释,则默认情况下可以将其解释为非空。或者,基础类型系统可以使用" 传统类型"的概念,在未经检查的转换时提出警告"需要(类似于泛型类型和原始类型的组合)。据我所知,Checkers Framework采用严格的方法,而Eclipse允许您在@NonNullByDefault策略和承认"遗留类型"之间进行选择。 (为了移民)。

据我所知,目前没有人计划投资这些注释的标准化。

答案 1 :(得分:4)

除了你提到的那些之外,还存在一些其他的零点分析;例如,IntelliJ包含nullness analysis

以下是关于无效性分析的一些关键问题:

  • 它在编译时或运行时是否有效?编译时分析为程序员提供有关潜在错误的预警。通过运行时分析,您的程序仍然崩溃,但可能会更早崩溃或提供更多信息性错误消息。

  • 是验证者还是错误发现者?验证程序提供正确性保证:如果工具未报告任何潜在错误,则程序将不会在运行时遭受给定错误。错误查找程序会报告一些问题,但如果它没有报告任何问题,那么您的程序可能仍然是错误的。验证者通常需要程序员的更多工作,包括注释程序。错误查找程序开始使用时可能需要较少的工作量,因为它可以在未注释的程序上运行(尽管在这种情况下可能无法提供非常好的结果)。

  • 分析有多精确?当程序实际上正确时,它经常出现误报或发出警告的频率?它经常会错过警报,或者没有通知您程序中的真正错误?

  • 工具是否内置于IDE中?如果是这样,它可能更容易使用。如果没有,任何程序员都可以使用它,而不仅仅是那些使用该特定IDE的人。

您提到的三个工具都在编译时工作。 FindBugs是一个bug查找程序,其他人是验证程序。 Checker Framework具有更好的精度,但另外两个具有更好的IDE集成。 FindBugs不能使用Java 8类型注释(JSR 308);其他两个都支持Java 8和Java-8之前的注释。所有这些工具都在程序员的工具箱中占有一席之地;哪一个适合您,取决于您的需求和目标。

回答其他一些问题:

FindBugs的注释使用javax域,因为它的设计者希望Oracle将FindBugs作为Java标准(!)。这从来没有发生过。你是对的,javax的使用让很多人误以为它是官方的或受甲骨文青睐的,但事实并非如此。

  

是否(将会)成为一个标准,还是每个人都想编写自己的分析框架?

目前,Oracle希望社区尝试创建和使用各种分析框架。他们觉得他们还没有充分理解各种方法的优缺点,足以创造一个标准。他们不想过早地制定一个标准,以便制定一个有缺陷的方法。他们愿意在未来制定标准。