不可变和最终之间的区别

时间:2014-04-16 06:47:03

标签: groovy

immutable和final之间有什么区别?

例如,这个

@Immutable
public MyClass {
   String property1 
   MyOtherClass property2
   List myLIst
}

public final MyClass {
   final String property1 
   final MyOtherClass property2
   final List myLIst
}

2 个答案:

答案 0 :(得分:5)

  

@Immutable注释指示编译器执行AST转换,该转换添加必要的getter,constructor,equals,hashCode和其他辅助方法,这些方法通常在创建具有已定义属性的不可变类时编写。   [1]

因此,@ Immrange会生成辅助功能,类似于Scala中的“case classes”。 final关键字指示编译器特定变量是不可变的,就像在Java中一样。

第一个类等同于具有多个辅助函数的第二个类。

[1] http://groovy.codehaus.org/gapi/groovy/transform/Immutable.html

答案 1 :(得分:3)

@Immutable annoatation导致编译器转换一个类,使其在构造后无法更改。 final修饰符 - 应用于变量/字段时 - 确保在构造后无法重新分配变量。当应用于类时,final会阻止该类被扩展。

当一个类声明为不可变时,所有属性的类型也必须是不可变的,或者编译器必须知道如何使它们成为不可变的,它对DateCollection,{{ 1}}等等。因此,在上面的示例中,Map也必须是不可变的。

说明最终字段和不可变字段之间的区别

MyOtherClass

因为class FinalClass { final List list } 是最终版,所以无法在构造之后重新分配它:

list

但你可以改变这个字段,例如

def fc = new FinalClass(list: [])
fc.list = [] // throws a ReadOnlyPropertyException

相比之下,不可变类的字段既不能重新分配也不能变异。例如,如果def fc = new FinalClass(list: []) fc.list << new Object() 注释为FinalClass,则以下尝试改变字段将导致抛出异常

@Immutable