2014-11-24 52 views
2

我得到了不变性的概念,以及为什么使DTO不可变是一个好主意。用@Immutable注释一个不可变的Java类有什么好处?

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

我的问题是:什么注释一个Java类为@Immutable给我们?是否有任何库函数只适用于以这种方式注释的类?

+1

“@ Immutable”注释主要用于'documentation'目的。 – 2014-11-24 10:12:09

回答

4

该注释记录了您的班级不可变的事实,并告知班级的用户您已遵循the annotation javadoc中定义的合同。直接在javadoc中直接添加注释也很常见:这是JDK选择的方法,例如参见javadoc of LocalDate

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

2

主要好处是文档。 JCIP注释是在没有实现的情况下引入的,理论上它们提供了文档的好处,即使它们没有被检查也是如此。

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

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

  1. 在编译的时候,你的程序可能无法编译,因为它没有尊重库的合同 - 换句话说,如果你的程序包含一个永恒的错误,编译器会发出警告。这是Checker Framework的IGJ Immutability Checker的工作原理。或者,您可以在构建时运行其他分析,如果分析失败,则可能会失败。这就是FindBugs的工作方式(另请参阅MutabilityDetector4FindBugs,第三方附件)。

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

一个警告:@Immutable有多个同样有效的定义,并且很容易将它们混合在一起导致混淆。例如,关于Java堆的不变性(不允许任何字段允许更改),还是关于抽象值(只要没有客户端可以观察到,就允许内部表示更改)?作为另一个例子,不变性是浅的(对这个对象没有改变,但允许改变它引用的对象)或传递性的(对这个对象或它引用的任何对象没有改变)?不变性是否通过给定的参考或变量来防止更改,还是防止通过别名进行更改?确保你了解你的工具做了什么选择。

0

Java注释@Immutable给我们带来了什么?

java中的注释本身不做任何事情。但它们被外部工具使用。看看这些注释的非常好的检查Intellij IDEA

相关问题