使用@Immutable注释不可变Java类的优点是什么?

时间:2014-11-24 09:55:08

标签: java concurrency annotations immutability

我得到了不变性的概念,以及为什么让DTO不可变是一个好主意。

我还注意到Java有一个@Immutable注释,我们可以使用它来注释不可变类。

我的问题是:将@Immutable注释为Java类给了我们什么?是否有任何库功能仅适用于以这种方式注释的类?

3 个答案:

答案 0 :(得分:10)

注释记录了您的类是不可变的这一事实,并告诉该类的用户您已遵循the annotation javadoc中定义的合同。简单地在javadoc中直接包含注释也很常见:这是JDK选择的方法,例如参见javadoc of LocalDate

一些静态分析工具(如FindBugs)也可以使用该注释并验证该类是否真的是不可变的。例如,如果您忘记进行公共领域决赛,FindBugs将发出警告。

答案 1 :(得分:4)

主要好处是文档。 JCIP注释是在没有实现的情况下引入的,理论上即使未经过检查,它们也可以通过编写提供文档优势。

我不知道任何当前的库功能取决于您的类被注释为@Immutable。

有两种方法可以存在@Immutable注释可能会影响您的程序。

  1. 在编译时,您的程序可能无法编译,因为它不遵守库的合同 - 换句话说,如果您的程序包含不可变性错误,编译器会发出警告。这就是Checker Framework IGJ Immutability Checker的工作原理。或者,您可以在构建时运行其他分析,并在分析失败时使构建失败。这就是FindBugs的工作方式(另请参阅MutabilityDetector4FindBugs,第三方插件)。

  2. 在运行时,库可以使用反射或类似的分析来读取程序的类文件。库可能会有不同的行为(例如抛出错误),具体取决于它是否找到@Immutable注释。

  3. 警告:@Immutable有多个同样有效的定义,很容易混淆它们,这会导致混乱。例如,相对于Java堆的不变性(不允许对任何字段进行任何更改),或者相对于抽象值(只要没有客户端可以观察它们,就允许内部表示更改)?另一个例子是,不变性是浅层的(对象没有变化,但允许对它引用的对象进行更改)或传递(不更改此对象或它引用的任何对象)?不变性是否会阻止通过给定的引用或变量进行更改,还是会阻止通过别名进行更改?确保您了解工具的选择。

答案 2 :(得分:0)

  

注释Java类为@Immutable会给我们带来什么?

java中的注释本身不起任何作用。但它们被外部工具使用。在Intellij IDEA

中查看对此类注释的非常好的检查
相关问题