2014-01-13 4 views
3

Возможно ли в Groovy сделать объект неизменным во время выполнения? Я знаю, что есть неизменяемая аннотация, но это работает только для того, чтобы создать объект с помощью конструктора, а затем никогда не изменять его. Я хочу что-то, где я могу создать объект вызова 3 или 4 метода, а затем сделать его неизменным, чтобы его нельзя было снова изменить?Сделать объект неизменным во время выполнения

Любые идеи о том, как это сделать?

Спасибо.

ответ

3

Я не верю, что вы можете. Вероятно, вы могли бы удалить сеттеры через мета-класс, но вам будет сложно сделать поля окончательными, и коллекции нужно будет заменить на неизменные варианты.

Начиная с 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

Если вы хотите объект Immutable и хотите вызвать некоторые методы раньше (для целей конфигурации?), Может быть полезно посмотреть Builder Effective Java Joshua Bloch (page 11). Это класс, который вы можете создать для настройки своего объекта, а затем получить его неизменяемый экземпляр.

Кроме того, я проверил подход рефлексии, но похоже, что вы не можете ограничить доступ к нему через него.

Смежные вопросы