我正在尋找一些構建不可變類的有效方法,就像Java的String類一樣。使對象不可變的可能方法
1
A
回答
8
- 所有字段必須
private
,最好final
- 確保類不能 覆蓋 - 使課堂最後, 或使用靜態工廠,並保持 構造私人
- 字段必須填充 構造函數/工廠
- 不要爲 字段提供任何setters
- 小心收藏。使用
Collections.unmodifiable*
。此外,收藏應該只包含一個不可改變的對象 - 所有干將必須提供 不可變對象或使用defensive copying
- 不提供 改變 對象的內部狀態的任何方法。
Tom Hawtin指出final
可以是可選的。 String
class
有一個緩存hash
var僅在調用散列函數時才分配。
1
如果一個對象的所有字段都不可修改,則對象是不可變的,所以這些字段必須是final
。如果你不希望你的對象被子類化,那麼你也可以讓它自己成爲final
,就像String一樣。 要輕鬆構建一個不可變的對象有很多的信息,你應該看看Factory Pattern
欲瞭解更多信息,請參閱Wikipedia
1
如果您填充使用構造各個領域,使場決賽 - 你是中途那裏。
如果這些字段使用自定義類型 - 您可能還需要使它們不可變。
任何屬於集合的字段都應該使用不可修改的集合 - 以確保安全。
你需要擔心的對象圖!
對象上的任何方法都需要注意非最終字段。例如。 String.add創建一個新的字符串。如果你需要改變一個字段 - 通過拷貝構造函數來完成。
最後使對象最終。
相關問題
- 1. 性能不可變的對象設計
- 2. NSMutableArray的NSMutableArray。變異的方法發送到不可變對象
- 3. 不同誘變方法發送到不可變對象
- 4. 發送給不可變對象的變異方法
- 5. [__NSCFDictionary setObject:forKey:]:發送到不可變對象的變異方法
- 6. 任何方式來從C#中的不可變對象派生可變對象?
- 7. 不可變對象內的可變對象
- 8. 可變對象和不可變對象之間的區別
- 9. NSInternalInconsistencyException變異方法發送到不可變對象在Xcode 6.1
- 10. 突變方法發送到不可變對象錯誤與mutableCopy()
- 11. 錯誤:replaceObjectAtIndex:withObject:]:突變方法發送到不可變對象
- 12. 可變大小的對象數組可能無法初始化
- 13. 如何限制對可變或不可變方法的訪問?
- 14. 變異方法發送到不可變對象,而對象是Mutiable
- 15. 將可變對象轉換爲不可變對象
- 16. JavaScript的使用可變值作爲對象的方法
- 17. 可變大小的對象可能不被初始化
- 18. 不可變的js地圖存儲對象丟失方法
- 19. Hibernate不可變值對象
- 20. 對象不可變異
- 21. 有效不可變對象
- 22. 與對象initialisers不可變對象
- 23. 不可能讓內部對象的方法私立外
- 24. 從單一方法可能返回不同類型的對象
- 25. 爲什麼不可變的對象拋出UnboundLocalError但可變的對象不?
- 26. 不能從使用對象的方法
- 27. 可能使用numpy方法內的sympy對象?
- 28. 當使用可變數組函數時發送給不可變對象的變異方法錯誤
- 29. 爲什麼對象的方法不可用於其他對象?
- 30. 將不可變對象轉換爲不可變對象(不可變或生成器)
你在找一個類似String功能的類嗎?我一開始並沒有這樣讀過你的問題,但是如果你這樣做,我會用一些String特定的例子來改變我的答案。 – Jorn 2009-06-19 09:47:08
字符串是Java中的特殊公民。它不完全是一個原始類型,但你也不能認爲它是一個類。字符串是重載+運算符的唯一「類」。添加兩個字符串將得到一個新的。操作符重載不適用於常規類。 – kgiannakakis 2009-06-19 09:52:10
不能考慮String類嗎??? – 2009-06-19 09:57:20