2012-05-28 53 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