首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Immutable在groovy中是如何工作的?

@Immutable在groovy中是如何工作的?
EN

Stack Overflow用户
提问于 2014-09-02 04:04:56
回答 1查看 194关注 0票数 6

当我在groovy控制台中执行下面的代码时,我会得到一个groovy.lang.ReadOnlyPropertyException。这与预期的一样,因为属性x不应该更改(因为ClassA是不可变的)。

代码语言:javascript
复制
import groovy.transform.Immutable
@Immutable class ClassA {
    int x
}

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

但是,如果将x变量的访问修饰符更改为私有,则可以在groovy控制台中执行此操作:

代码语言:javascript
复制
import groovy.transform.Immutable
@Immutable class ClassA {
    private int x
}

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

为什么会这样呢?为什么添加的private访问修饰符使ClassA变得可变?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-02 08:04:16

文档对此有明确的立场。他们总是谈论“财产”。还有一些努力表明,“滚动你自己的”并不被认为是“状态”:

您不必遵循Groovy的常规属性约定,例如,您可以创建一个显式的私有字段,然后编写显式的get和set方法。这种方法目前并不是禁止的(给您一些回旋的空间来绕过这些约定),但是以这种方式创建的任何字段都被认为不是对象的重要状态的一部分,也没有被考虑到等于方法或hashCode方法中。

这方面的一个重要指标是,toString是为此类类创建的。例如:

代码语言:javascript
复制
@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

将印刷:

代码语言:javascript
复制
A()
B(0)

显示,A.@a不是不可变的“计算”(“重要状态”)的一部分。而且,由于您可以在groovy中访问私有vars,所以上面的代码工作得很好。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25615665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档