用@immutable注释不可变Java类有什么好处?

用@immutable注释不可变Java类有什么好处?,java,concurrency,annotations,immutability,Java,Concurrency,Annotations,Immutability,我了解了不变性的概念,以及为什么使DTO不可变是个好主意 我还注意到Java有一个@Immutable注释,我们可以用它来注释不可变的类 我的问题是:将Java类注释为@Immutable会给我们带来什么?是否有任何库功能只对以这种方式注释的类起作用?注释记录了这样一个事实,即您的类是不可变的,并告诉类的用户您遵守了中定义的约定。直接在javadoc中包含注释也是很常见的:这是JDK选择的方法,参见示例 一些静态分析工具(如FindBugs)也可以使用该注释并验证该类是否真的是不可变的。例如,如

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

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


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

注释记录了这样一个事实,即您的类是不可变的,并告诉类的用户您遵守了中定义的约定。直接在javadoc中包含注释也是很常见的:这是JDK选择的方法,参见示例


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

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

我不知道当前有什么库特性依赖于类被注释为@Immutable

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

  • 在编译时,您的程序可能无法编译,因为它不遵守库的约定——换句话说,如果您的程序包含不变性错误,编译器将发出警告。这就是Checker框架的工作原理。或者,您可以在构建时运行其他分析,如果分析失败,则构建失败。这就是FindBugs的工作原理(另请参见第三方插件)

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

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

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


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

    中的
    @Immutable
    注释主要用于
    文档
    目的。