Я хочу, чтобы иметь возможность создавать объект на основе Moose, добавить к нему, пока я не сериализую его, а затем я хочу сделать его неизменным. Как я могу это сделать?make object instance immutable
ответ
я не знаю (и не могу легко найти) любые модули, чтобы сделать это на CPAN, который является удивительным, но объясняет, почему вы спрашиваете :-)
А «до того» модификатор над всеми своими атрибутами это очевидный способ сделать это. Я уверен, что есть подходящий метапрограммирующий способ получить список всех атрибутов доступа и применить модификатор, но у меня возникнет соблазн явным образом перечислить их все с большим комментарием.
Вы считаете, есть ли у вас один класс или два здесь (Thingy, LockedThingy)? Два класса позволят вам инкапсулировать мета-умение, если вы так склонны.
Я хотел бы сделать два класса и общей роли:
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 , и сама вещь, которая является объектом, который использовал остальной частью программы.
Я думаю, что термин, который вы ищете, это Factory, который знает, как построить объект. – xenoterracide
Ну, да, вроде. Но я ожидаю, что параметры должны собираться по нескольким вызовам методов. Но это может быть просто неправильное понимание того, что такое Фабрика. –
нет, я думаю, нет, на самом деле эффективная Java имеет такой тип сборки, что она не поддерживает хеши для конструкторов. С другой стороны, я начинаю задаваться вопросом, не все ли это связано с тем, что вы не рассматриваете undef как unset в конструкторе. – xenoterracide
Я рассмотрел множество вещей ... честно говоря, я могу, наверное, выяснить, как это сделать через швабру, но я как бы попросил посмотреть, что все идеи о том, как это сделать. – xenoterracide