Q
用值對象鏈接方法
4
A
回答
5
結論:這種做法是完全可以接受的。
我相信這通常是當你有一個不可變的對象時發生的。不是改變原來的對象,而是用給定的值創建一個新的對象並返回。使用方法鏈接進行和反對的參數與使用可變對象和不可變對象大致相同。
我唯一擔心的是,這對於班級的調用者來說很清楚 - 他們不能依賴與鏈接對象的身份相等性,並且必須明確調用不會改變原始對象。雖然如果他們實際上是串聯電話,他們不會分配中介對象,所以不會有很大的風險。重要的是它們只用使用方法鏈中的最後一個對象。
要使用java.lang.String中作爲一個例子,字符串的客戶這樣做:
myString.trim().replace("a", "b").substring(3, 9);
...沒什麼意思,和通常表示程序員的誤解。他們應該做的是:
String myNewString = myString.trim().replace("a", "b").substring(3, 9);
...然後在後續操作中使用myNewString
。有趣的是,Java,Findbugs的靜態分析工具可以檢測到這種誤解的實例,並將其報告爲可能的錯誤。
客戶理解是主要案例。其他缺點包括,如果價值對象的創建非常昂貴,那麼在每條鏈上創建一個新對象將會帶來性能上的衝擊。如果這可能是一個問題,你應該能夠從你自己的情況中看出來。在這種情況下,您可能需要實現Builder模式,而不是在每個方法鏈上創建新對象。
除了這些,我想不出任何其他問題。
2
大量的java類提供了不可變的值對象。 java.lang.String,java.math.BigInteger和java.math.BigDecimal是不可變的值對象,它們的方法返回一個新的對象。最大的缺點是人們對它並不瞭解,它不可改變,並認爲他們正在改變原創。
有些語言比其他語言更強調不變性。在Ruby中,字符串是可變的,並且集合通常提供一個返回副本的版本和另一個改變現有副本的版本(例如Array#sort和Array#sort!)。在Clojure中,不變性是常態。
2
相關問題
- 1. 鏈接方法返回的JQuery對象
- 2. 鏈接同一對象的方法
- 3. 鏈接到類通用的方法/對象
- 4. 如何將JButton鏈接到對象並調用相關方法
- 5. CoffeeScript的調用返回的對象的方法(鏈接)
- 6. 使用GCC鏈接對象的兩種方法?
- 7. 方法鏈接調用非對象的成員函數
- 8. 用於類實例變量的對象方法鏈接的Python方法
- 9. 將JavaScript變量鏈接到對象值。
- 10. 2「鏈接」對象
- 11. 鏈接方法
- 12. 無法將C++與C對象鏈接
- 13. 無法鏈接共享對象
- 14. 將對象屬性鏈接到類或對象的最佳實踐方法
- 15. JS方法從對象值調用
- 16. Fabric.js鏈接/取消鏈接2對象
- 17. 人物對象的Java鏈接列表 - 打印對象值
- 18. 用嵌套方法鏈接的方法
- 19. 用同樣的方法鏈接方法
- 20. 對象全局失敗的方法:超鏈接
- 21. 在軌道中鏈接habtm對象的正確方法?
- 22. 對象鏈接與API擴展中的方法
- 23. 爪哇鏈接列表中刪除對象的方法
- 24. 書寫方法銷燬並創建鏈接銷燬對象
- 25. Python:你如何鏈接方法列表的對象列表?
- 26. KendoUI移動鏈接給點擊「對象沒有方法」錯誤
- 27. jQuery的數據鏈接不與對象方法
- 28. 面向對象方法鏈接可選返回
- 29. Ruby 1.8.7:攔截對象的鏈接方法
- 30. 方法調用的鏈接
我提交你的審查,[權威方法鏈決策樹](http://chat.stackoverflow.com/transcript/message/4316194#4316194) – rdlowrey 2012-08-15 06:31:20