2014-01-13 55 views
3

Groovy有可能在運行時使對象不可變嗎?我知道有不可變的註釋,但是這隻能讓你使用構造函數創建對象,然後永遠不會改變它。我想要一些可以創建一個對象的方法調用3或4個方法,然後使其不可變,以便永遠不會再更改它?使對象在運行時不可變

有關如何做到這一點的任何想法?

謝謝。

回答

3

我不相信你可以。你可能可以通過元類去除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的控制檯工作...可能是值得看的,如果它的工作原理與包定期常規情況下,等

0

如果你想要一個不可變對象,並且想在之前調用某些方法(用於配置目的?),可以看看Builder Effective Java Joshua Bloch (page 11)。這是一個類,您可以創建它來配置對象,然後獲取它的不可變實例。

此外,我檢查了反射方法,但它看起來像你不能通過它限制字段訪問。