我喜歡能夠爲可以使用的類提供默認值,但問題是如果它們被更改,那麼它將影響對它的所有引用並且不會是「默認」。通過使用像這樣的默認值,它可以節省內存,並允許默認值(如果需要)傳播到所有使用默認值的引用。靜態不可變的默認實例
一個簡單的例子是
class A
{
static public A Default;
}
然後可以使用A.Default作爲A的「默認」的實例同樣,問題是,A是不是一成不變的或者至少是「凍結」並變爲它會改變所有的參考。如果這是人們想要的行爲,這可能很好,但如果默認情況下發生了意外更改,可能會造成嚴重破壞。
我真正需要的是一種深度凍結和解凍Default的方法。
很明顯,一種方法是簡單地讓所有setter只在一個條件上設置並將collection標記爲只讀。提供這樣簡單的行爲似乎有很多重複的工作。
有沒有一個簡單的庫,模式或反射來完成這個?寫入時複製能力會很好,所以如果試圖改變Default,就會創建一個新的可變實例。不僅如此,即使flyweight實例可以創建,如果它有機會提高性能(更改的大小)。
示例:假設您最初創建1M個具有所有相同狀態的大(內存大小)對象。通過使用默認模式,這隻會創建1個實際的對象。假設你改變了所有狀態的1個參數(比如位置),但對象本身非常大。使用flyweight模式,您只需1M個已更改的參數即可跟蹤(較慢但內存較少),而不是1M個新對象。在改變了足夠的參數之後,完整的對象最終被分配給它的引用。
這裏有什麼嗎?
在什麼情況下,你會想「解凍」默認與誰應該可以「解凍」默認? – shahkalpesh 2011-03-06 15:56:33
你確定你確實需要這個複雜的東西嗎? – 2011-03-06 16:00:57
這似乎是一個設計缺陷。你有一個類A,當它的「Default」實例不可變時,它是不可變的。Perhapes你需要兩個類,一個不可變和可變的,或者讓你的類A成爲一個結構體或值類型,比如object(即像String) – MerickOWA 2011-03-06 16:15:25