2016-08-01 38 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