groovy - 使对象在运行时不可变

标签 groovy

在 Groovy 中是否可以使对象在运行时不可变?我知道有不可变注释,但这只允许您使用构造函数创建对象,然后从不更改它。我想要一些东西,我可以在其中创建一个对象调用 3 或 4 个方法,然后使其不可变,以便它永远不会再次更改?

关于如何做到这一点有什么想法吗?

谢谢。

最佳答案

我不相信你可以。您可能会通过元类删除 setter,但您很难使字段成为最终字段,并且需要将集合更改为不可变变体。

从 Groovy 2.2.1 开始,您将 copyWith 添加到 Immutable 中……也许这会有帮助?

import groovy.transform.*

@Immutable( copyWith=true )
class Test {
    String name
    int age
    List likes
}

def alice = new Test( 'alice', 26, [ 'cheese' ] )
tim = alice.copyWith( name:'tim', age:32 )
timHam = tim.copyWith( likes:[ 'ham' ] )

assert alice.name == 'alice' && alice.age == 26  && alice.likes == [ 'cheese' ]
assert tim.name == 'tim'     && tim.age == 32    && tim.likes == [ 'cheese' ]
assert timHam.name == 'tim'  && timHam.age == 32 && timHam.likes == [ 'ham' ]

还有这个 Immutator package对于 Java,这看起来很有趣,但我无法让它在 Groovy 控制台中工作......如果它在带有包等的常规 groovy 上下文中工作,可能值得一看

关于groovy - 使对象在运行时不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21091029/

相关文章:

Java CharsetDecoder在每个字符后插入空格

grails - 迭代可能是字符串或字符串数​​组的 Groovy 对象

json - 在Groovy中使用jsonbuilder修改json

java - Groovy Grape 没有下载新的修订版本

groovy - 如何从Groovy中的对象字段中提取新列表

Groovy 提示意外的 token : ->

java - 如何显示 Groovy AntBuilder 类路径中包含的所有资源?

groovy - 局部变量的名称查找

带冒号的 Groovy 扩展运算符映射语法

Jenkins:我如何知道自动流程或用户是否触发了构建?