在Groovy中是否可以使对象在运行时不可变?我知道这里有不可变的注释,但这只能通过使用构造函数创建对象,然后再从不更改它而起作用。我想要可以在其中创建一个对象调用3或4方法,然后使其不可变的东西,这样它就永远无法更改了吗?

有关如何执行此操作的任何想法?

谢谢。

最佳答案

我不相信你可以。您可能可以通过meta类删除 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' ]

还有一个用于Java的Immutator package看起来很有趣,但是我无法在Groovy控制台中使用它。...可能值得一看,它是否可以在带有包等常规groovy上下文中工作。

10-07 17:05