2014-09-02 23 views
6

當我執行在常規控制檯下面的代碼,我得到一個groovy.lang.ReadOnlyPropertyException。這與預期的一樣,因爲財產x不可能改變(因爲ClassA是不可改變的)。@Immutable在groovy中如何工作?

import groovy.transform.Immutable 
@Immutable class ClassA { 
    int x 
} 

def a = new ClassA(x: 5); 
a.x = 1 

但如果改變訪問修飾符私人的x變量,那麼我可以在常規控制檯執行此:

import groovy.transform.Immutable 
@Immutable class ClassA { 
    private int x 
} 

def a = new ClassA(x: 5); 
a.x = 1 
println(a.x) 

這是爲什麼?爲什麼添加的private訪問修飾符使得ClassA可變?

回答

8

docs對此明確表態。他們總是談論「屬性」。也有exerpts指出,「滾動你自己」不被視爲「狀態」:

您不必遵循Groovy的常規屬性約定,例如,你可以創建一個明確的私有字段,然後你可以編寫顯式的get和set方法。這種方法目前並未被禁止(給你一些擺脫這些約定的空間),但是以這種方式創建的任何域都被認爲不是該對象的重要狀態的一部分,或hashCode方法。

一個簡單的指標是這樣的事實,toString是爲這樣的類創建的。例如: -

@groovy.transform.Immutable 
class A { 
    private int a 
} 

@groovy.transform.Immutable 
class B { 
    int b 
} 

a=new A() 
a.a = 42 
println a 
b=new B() 
// b.b = 42 
println b 

會打印:

A() 
B(0) 

顯示,這[email protected]不是 「計算」 爲不變性(以下簡稱 「顯著狀態」)的一部分。而且你可以通過groovy訪問私有變量,上面的代碼工作得很好。