当我在groovy控制台中执行下面的代码时,我会得到一个groovy.lang.ReadOnlyPropertyException。这与预期的一样,因为属性x不应该更改(因为ClassA是不可变的)。
import groovy.transform.Immutable
@Immutable class ClassA {
int x
}
def a = new ClassA(x: 5);
a.x = 1但是,如果将x变量的访问修饰符更改为私有,则可以在groovy控制台中执行此操作:
import groovy.transform.Immutable
@Immutable class ClassA {
private int x
}
def a = new ClassA(x: 5);
a.x = 1
println(a.x)为什么会这样呢?为什么添加的private访问修饰符使ClassA变得可变?
发布于 2014-09-02 08:04:16
文档对此有明确的立场。他们总是谈论“财产”。还有一些努力表明,“滚动你自己的”并不被认为是“状态”:
您不必遵循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)显示,A.@a不是不可变的“计算”(“重要状态”)的一部分。而且,由于您可以在groovy中访问私有vars,所以上面的代码工作得很好。
https://stackoverflow.com/questions/25615665
复制相似问题