2012-05-28 3 views
3

Я хочу, чтобы иметь возможность создавать объект на основе Moose, добавить к нему, пока я не сериализую его, а затем я хочу сделать его неизменным. Как я могу это сделать?make object instance immutable

ответ

0

я не знаю (и не могу легко найти) любые модули, чтобы сделать это на CPAN, который является удивительным, но объясняет, почему вы спрашиваете :-)

А «до того» модификатор над всеми своими атрибутами это очевидный способ сделать это. Я уверен, что есть подходящий метапрограммирующий способ получить список всех атрибутов доступа и применить модификатор, но у меня возникнет соблазн явным образом перечислить их все с большим комментарием.

Вы считаете, есть ли у вас один класс или два здесь (Thingy, LockedThingy)? Два класса позволят вам инкапсулировать мета-умение, если вы так склонны.

+0

Я рассмотрел множество вещей ... честно говоря, я могу, наверное, выяснить, как это сделать через швабру, но я как бы попросил посмотреть, что все идеи о том, как это сделать. – xenoterracide

1

Я хотел бы сделать два класса и общей роли:

package Thing 
use Moose::Role; 

has some_attrib => (isa => 'AnotherThing'); 

### Behaviour (the important stuff) goes here 

package ImmutableThing; 
use Moose; 

with 'Thing'; 

has +some_attrib => (is => 'ro'); 

sub finalize { shift } 

package MutableThing 
use Moose; 

with 'Thing'; 

has +some_attrib => (is => 'rw'); 

sub finalize { 
    my $self = shift; 
    Thing->new({some_attrib => $self->some_attrib}); 
} 

я не уверен, что с изменяемые и неизменяемые формы одного и того же класса всегда хорошая идея, хотя. Я стараюсь думать о времени сборки и времени работы как о двух разных фазах с разными интерфейсами.

Я был бы более склонен писать сборщик параметров (я использовал его как шаблон, но я не видел его в литературе), который имеет интерфейс, оптимизированный для сбора информации, необходимой для создания Thing , и сама вещь, которая является объектом, который использовал остальной частью программы.

+0

Я думаю, что термин, который вы ищете, это Factory, который знает, как построить объект. – xenoterracide

+0

Ну, да, вроде. Но я ожидаю, что параметры должны собираться по нескольким вызовам методов. Но это может быть просто неправильное понимание того, что такое Фабрика. –

+0

нет, я думаю, нет, на самом деле эффективная Java имеет такой тип сборки, что она не поддерживает хеши для конструкторов. С другой стороны, я начинаю задаваться вопросом, не все ли это связано с тем, что вы не рассматриваете undef как unset в конструкторе. – xenoterracide