Groovy 使对象在运行时不可变

Groovy 使对象在运行时不可变,groovy,Groovy,在Groovy中是否可以使对象在运行时不可变?我知道有不可变的注释,但这只允许您使用构造函数创建对象,然后再不更改它。我想要一些东西,在那里我可以创建一个对象调用3或4个方法,然后使它不可变,这样它就再也不能被更改了 有什么办法吗 谢谢。我不相信你能。您可能会通过元类删除setter,但要使字段成为最终字段,需要将集合更改为不可变变量 从Groovy 2.2.1开始,除了不可变的之外,还增加了copyWith。。。也许这能帮上忙 import groovy.transform.* @Immut

在Groovy中是否可以使对象在运行时不可变?我知道有不可变的注释,但这只允许您使用构造函数创建对象,然后再不更改它。我想要一些东西,在那里我可以创建一个对象调用3或4个方法,然后使它不可变,这样它就再也不能被更改了

有什么办法吗


谢谢。

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

从Groovy 2.2.1开始,除了
不可变的
之外,还增加了
copyWith
。。。也许这能帮上忙

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' ]

Java也有这样的功能,看起来很有趣,但我无法在Groovy控制台中使用它。。。如果您想要一个不可变的对象,并且想在之前调用一些方法(出于配置目的?),那么最好看看Builder。它是一个类,您可以创建它来配置您的对象,然后获取它的不可变实例

另外,我已经检查了反射方法,但看起来您不能通过它限制字段访问