Groovy有可能在運行時使對象不可變嗎?我知道有不可變的註釋,但是這隻能讓你使用構造函數創建對象,然後永遠不會改變它。我想要一些可以創建一個對象的方法調用3或4個方法,然後使其不可變,以便永遠不會再更改它?使對象在運行時不可變
有關如何做到這一點的任何想法?
謝謝。
Groovy有可能在運行時使對象不可變嗎?我知道有不可變的註釋,但是這隻能讓你使用構造函數創建對象,然後永遠不會改變它。我想要一些可以創建一個對象的方法調用3或4個方法,然後使其不可變,以便永遠不會再更改它?使對象在運行時不可變
有關如何做到這一點的任何想法?
謝謝。
我不相信你可以。你可能可以通過元類去除setter,但是你很難將這些字段設置爲final,並且需要將集合改爲不可變的變體。
從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的控制檯工作...可能是值得看的,如果它的工作原理與包定期常規情況下,等
如果你想要一個不可變對象,並且想在之前調用某些方法(用於配置目的?),可以看看Builder Effective Java Joshua Bloch (page 11)。這是一個類,您可以創建它來配置對象,然後獲取它的不可變實例。
此外,我檢查了反射方法,但它看起來像你不能通過它限制字段訪問。