我希望能夠實例化一個基於Moose的對象添加到它,直到我序列化它,然後我想使它不可更改。我該怎麼做/應該怎麼做?使對象實例不可變
使對象實例不可變
回答
我不知道(也不可能很容易找到)的任何模塊,以做到這一點的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});
}
我不知道具有相同類的可變和不可變的形式必然是,雖然是個好主意。我傾向於將構建時間和運行時間考慮爲具有不同接口的兩個不同階段。
我會更傾向於編寫一個參數收集器(我已將它大寫爲它的樣式,但我沒有在文獻中看到過),它具有優化的界面以收集創建事物所需的信息,以及本身的東西,這是對象使用其餘的程序。
我認爲你要找的術語是工廠,它知道如何構造一個物體 – xenoterracide
嗯,是的,有點。但我期待通過多個方法調用收集所需的參數。但那可能只是我誤解了一家工廠。 –
不,我猜不是,實際上有效的Java有一種構建模式,因爲它不支持構造函數的散列。另一方面,我開始懷疑,這是否並非都歸結爲不將undef視爲構造函數中未設置的。 – xenoterracide
- 1. 實例化不可變配對對象
- 2. 實例化對象變量可見性
- 3. 實例化一個不可變數組中的多個對象
- 4. 實例化不可變對象與反思
- 5. 使用可變數量的參數實例化一個對象
- 6. 使AS3/Flex類可擴展但不可實例化爲對象?
- 7. TypeError:'type'對象不可迭代 - 迭代對象實例
- 8. 新對象不實例SMO
- 9. 使用不同類中的對象的實例變量
- 10. 獲取對象的實例變量
- 11. 在javascript中變更對象的實例
- 12. 檢票模型對象實例改變
- 13. 由對象共享的實例變量?
- 14. JNI訪問對象的實例變量
- 15. 實例變量和對象,定義類
- 16. 從變量實例化新對象
- 17. Rails - 初始化對象實例變量
- 18. 創建不可變的對象,實例化而不需要新的
- 19. Java對象實例 - 什麼不對的:
- 20. 用於添加多個對象實例的可變參數
- 21. 我可以模擬不可能實例化的對象嗎?
- 22. 在對象實例
- 23. 對象實例化
- 24. 實例vs對象
- 25. 對象與實例
- 26. MongoDB對象實例
- 27. String對象實例
- 28. 對象實例化
- 29. 類對象實例
- 30. ConnectionString對象實例
我已經考慮了很多事情......我誠懇地可以弄清楚如何通過拖把來做到這一點,但我有點被問到如何去做所有的想法。 – xenoterracide