從內存分配的角度來看,創建無狀態靜態實用類與無狀態非靜態實用類有什麼區別嗎?根據我的理解,靜態類可能實際上會更好,因爲在GC堆上不會分配對象。只有方法表將在高頻堆上創建,而對於非靜態類,將在GC堆上與HF堆上的方法表一起創建一個對象。需要你們的幫助來確認它,並請告訴我是否缺少其他考慮因素。實用程序/助手無狀態靜態類vs無狀態非靜態類
4
A
回答
4
是的。如果這些方法都是靜態的,那麼沒有實例將在託管堆上。每次調用時,都會直接引用該類型並訪問它的成員,而無需在堆上分配內存。
如果您有一個實例類,那麼每次創建實例時,都會在堆上產生成本。如果你還沒有堅持引用,那麼你將在CLR的第0代產生高流失。這假定你將創建大量的對象來進行這些調用。
當然,如果您正在實施the singleton pattern,那麼成本將會很小,因爲您只需實施一個單個實例對象。
但是,這一切都沒有實際意義,因爲它是一個micro optimization;除非您發現自己創建了大量這些對象來執行此功能,並且通過分析確定您實際上存在問題,那麼它應該是最簡單的維護問題。
雖然我會說,如果一個方法是無狀態的,它自然看起來像它將運行一個現有的類型,那麼我通常會寫一個extension method;它是一個靜態的調用,但給出了一個實例調用的外觀,這對於一些(和我本人而言)在代碼中具有比直接調用靜態方法更好的流程(尤其是當它使我能夠設計fluent interface時)。
+0
非常感謝!擴展方法絕對是實現幫助器方法的更好方法。 – jags 2012-08-15 19:49:50
相關問題
- 1. 靜態與非靜態類
- 2. 無狀態EJB中的靜態vs實例成員
- 3. 從靜態類觸發非靜態類?
- 4. 訪問非靜態類的靜態類
- 5. Combinig靜態類和非靜態類
- 6. Java:非靜態類和靜態調用
- 7. C#靜態類 - 靜態類不能有非靜態成員
- 8. 無法對非靜態類成員進行靜態引用
- 9. 無法對非靜態類型進行靜態引用T
- 10. 靜態主類靜態類?
- 11. c#靜態或非靜態類
- 12. 聲明非靜態類靜態
- 13. 聲明類的靜態和非靜態
- 14. 靜態形狀
- 15. 無狀態的餅乾VS全狀態
- 16. Keras - 有狀態vs無狀態LSTM
- 17. 想從非靜態類訪問靜態成員的非靜態子類的Java
- 18. Android的靜態VS非靜態問題
- 19. 靜態文件狀態'404
- 20. 如何序列化非靜態子類的靜態類
- 21. 靜態類vs單身類
- 22. 靜態新手:靜態類/方法中的非靜態變量是否意味着靜態?
- 23. 單身和靜態實用程序類
- 24. 單型態VS靜態類型
- 25. 單鏈表 - 無法對靜態類型進行靜態引用
- 26. 無法對靜態類型進行靜態引用E
- 27. PHP - 設計無狀態類
- 28. C#類實例的靜態方法VS靜態類的內存使用情況
- 29. 非靜態類中的靜態方法和靜態類中的靜態方法有什麼區別?
- 30. 靜態線程函數訪問非靜態類成員在C++
微。優化。 – Oded 2012-08-15 19:00:12
確實......你需要做多少個非靜態類的實例化? – spender 2012-08-15 19:09:18
@spender:這是我認爲需要建議的地方。一個非靜態類將不得不被實例化,以便訪問任何成員,而靜態類不會有這樣的需求。一個非靜態類可以實現爲單例類,以避免多個實例,因爲空對象會消耗12個字節的內存,但如果類由純實用程序成員組成,那麼這似乎不值得付出努力。 – jags 2012-08-15 19:36:54