【问题标题】:What is the advantage of annotating an immutable Java class with @Immutable?使用 @Immutable 注释不可变 Java 类有什么好处?
【发布时间】:2014-11-24 09:55:08
【问题描述】:

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

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

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

【问题讨论】:

  • @Immutable 注解主要仅用于documentation 目的。

标签: java concurrency annotations immutability


【解决方案1】:

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

一些静态分析工具(例如 FindBugs)也可以使用该注释并验证该类确实是不可变的。例如,如果您忘记将公共字段设为 final,FindBugs 会发出警告。

【讨论】:

    【解决方案2】:

    主要的好处是文档。 JCIP 注释是在没有实现的情况下引入的,其理论是即使没有检查它们也可以从编写文档中受益。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      将 Java 类注解为 @Immutable 能给我们带来什么?

      Java 中的注释本身不做任何事情,但它们被外部工具使用。看看IntelliJ IDEA 中对此类注释的非常好的检查。

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 2011-10-22
        • 1970-01-01
        • 2016-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多