2016-08-01 39 views
0

我們目前在@Immutable類中使用基於地圖的構造函數,並在實例化過程中傳遞所有的字段值。我想爲字段設置合理的默認值,以防在實例化過程中用戶沒有爲它們提供任何值。如何使用字段的默認回退值創建@Immutable Groovy類?

有沒有一個常規的方法(一種簡單的方法)來做到這一點?

回答

1

您可以在類聲明的屬性填​​寫:

@groovy.transform.Immutable 
class Person { 
    String name = 'john' 
} 

p = new Person(name: 'percy') 
assert p.name == 'percy' 

p2 = new Person() 
assert p2.name == 'john' 

更新: Groovy的失敗,如果任何setter方法是創建對象後使用。

try { 
    p2.name = 'echo' 
    assert p2.name == 'echo' 
    assert false 
} catch(e) { 
    assert true 
} 

更新2:啊,groovyConsole救援。 @Immutable正在設置構造函數中的name字段,因此,該字段實際上是最終的。

enter image description here

+0

啊,由於某種原因,我的印象是,這些領域是'final'(我的壞)。謝謝。 – phani

+2

這些字段*是*最終的。在這個例子中沒有什麼可以表明它們不是。 Doc:http://docs.groovy-lang.org/latest/html/gapi/groovy/transform/Immutable.html –

+0

@MichaelEaster在上面的例子中,字段name被賦值兩次:一次的聲明和另一次在隱式基於地圖的構造函數中。這是不允許「最終」變量(至少在Java中,我是Groovy的新手)。請糾正我,如果我失去了一些東西。 – phani