@Immutable如何在groovy中工作?

时间:2014-09-02 04:04:57

标签: groovy

当我在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变量的访问修饰符更改为private,那么我可以在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变为可变?

1 个答案:

答案 0 :(得分:8)

docs对此有明确的立场。他们总是谈论"属性"。也有exerpts表明,"滚动你自己"不被视为"州":

  

您不必遵循Groovy的正常财产惯例,例如您可以创建一个显式私有字段,然后您可以编写显式的get和set方法。这种方法目前还没有被禁止(给你一些摆动这些约定的空间),但是以这种方式创建的任何字段都被认为不是对象的重要状态的一部分,并且不是在equals或hashCode方法中考虑因素。

这是一个微不足道的指标,就是为这些类创建了toString。 e.g:

@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中访问私有变量,你上面的代码就可以了。