immutable和final之间有什么区别?
例如,这个
@Immutable
public MyClass {
String property1
MyOtherClass property2
List myLIst
}
和
public final MyClass {
final String property1
final MyOtherClass property2
final List myLIst
}
答案 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
会阻止该类被扩展。
当一个类声明为不可变时,所有属性的类型也必须是不可变的,或者编译器必须知道如何使它们成为不可变的,它对Date
,Collection
,{{ 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