2012-05-28 28 views
3

我希望能够实例化一个基于Moose的对象添加到它,直到我序列化它,然后我想使它不可更改。我该怎么做/应该怎么做?使对象实例不可变

回答

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}); 
} 

我不知道具有相同类的可变和不可变的形式必然是,虽然是个好主意。我倾向于将构建时间和运行时间考虑为具有不同接口的两个不同阶段。

我会更倾向于编写一个参数收集器(我已将它大写为它的样式,但我没有在文献中看到过),它具有优化的界面以收集创建事物所需的信息,以及本身的东西,这是对象使用其余的程序。

+0

我认为你要找的术语是工厂,它知道如何构造一个物体 – xenoterracide

+0

嗯,是的,有点。但我期待通过多个方法调用收集所需的参数。但那可能只是我误解了一家工厂。 –

+0

不,我猜不是,实际上有效的Java有一种构建模式,因为它不支持构造函数的散列。另一方面,我开始怀疑,这是否并非都归结为不将undef视为构造函数中未设置的。 – xenoterracide