根據我的理解,我們應該只在處理對象狀態(即實例變量)時才使用方法。如果方法處理對象的狀態,它們應該總是被聲明爲類方法,即靜態的。但仍然在大多數項目中 我已經看到了從未對實例變量進行操作的方法,它們也被聲明爲實例方法(基本上這些方法正在做什麼,它們正在使用某些方法參數並對該部分做了一些處理,調用其他類)。這就是它。 不應該將這些方法聲明爲類方法,即靜態嗎?在java中的靜態方法vs實例方法的決定?
回答
這是有可能的答案是肯定的:如果你有沒有采取實際的實例狀態的優勢的實例方法,那麼它也許應該是static
,並可能轉移到這取決於它的輔助類確實。
請注意,即使您不訪問實例變量,訪問實例方法也會使方法不能成爲static
。另外,如果這個方法是一個實例方法,以便將來能夠抵抗它(預期稍後使用實例狀態),那麼改變它也不是可取的。
同樣重要的是公共非靜態方法可以被子類繼承和重寫,因此使它們實際上可能以意想不到的方式破壞代碼。
你不能指望每個人都始終遵循一條道路,無論是否是最佳實踐。首先,我們都是人類。我們可以選擇一種有時不同的方式,而這種方式不應該一直是完全正確的。即使框架和圖書館和語言是由人類創建的,所以錯誤不應該讓你感到驚訝,也不會讓你感到困擾。
對於其他一切,我同意dlev。
這是一個很好的觀點,人們會犯錯誤。有一個實例方法通常不是什麼大事,它可能是「靜態」的,實際上它總是發生。 – dlev
這裏有一個[可能不完整]列表時,必須使用實例方法在靜態的:
- 訪問實例變量/從方法
- 方法中的方法是,你實現 抽象方法
- 的方法是,你實現
- 您對方法的懷疑在長期停留靜態接口方法
- 聲明它並且不想鎖定班級,而是鎖定實例
- 您以非靜態方式訪問靜態方法時會收到警告,並且您真的關心它們(有時您無法避免在非所以你唯一的選擇是讓他們的方法是非靜態的)
你可能在所有其他情況下可以靜態。
靜態方法的缺點是它們將調用者與實現緊密耦合。實例方法可以被重寫,也可以是接口方法的多個實現之一。
換句話說,實例方法可以促進鬆耦合,可測試性和重用。
假設我們正在設計一種新語言,我們希望Sqrt是一個實例方法。所以我們看一下雙人班並開始設計。它顯然沒有輸入(除了實例)並返回一個double。我們編寫和測試代碼。完美。
但是,取整數的平方根也是有效的,我們不希望強制每個人都轉換爲雙精度來取平方根。所以我們轉向int並開始設計。它返回什麼?我們可以返回一個int並使其僅適用於完美平方,或將結果四捨五入到最接近的整數(忽略關於現在正確舍入方法的爭論)。但是如果有人想要一個非整數結果呢?我們是否應該有兩個方法 - 一個返回一個int,一個返回double(這在某些語言中不可能改變名稱)。所以我們決定它應該返回一倍。現在我們執行。但是這個實現和我們用於double的實現是一樣的。我們是否複製並粘貼?我們是否將該實例轉換爲double並調用該實例方法?爲什麼不把邏輯放在可以從兩個類中訪問的庫方法中。我們將調用庫Math和函數Math.Sqrt。
- 1. 靜態方法vs靜態實例
- 2. C#靜態方法vs對象實例
- 3. 靜態方法的Java實例變量
- 4. Mongoose'靜態'方法與'實例'方法
- 5. 靜態方法和實例方法C#
- 6. 靜態方法vs實例方法,多線程,性能
- 7. Java靜態/實例方法優化
- 8. Java靜態方法vs主要靜態方法
- 9. 靜態方法或實例方法中的實際代碼
- 10. 新的類實例VS Singleton類VS靜態方法
- 11. Python中的靜態和實例方法
- 12. 靜態方法VS在BLL
- 13. 使用靜態方法vs實例化包含方法的類的性能
- 14. 最好的方法從靜態返回新的對象/ isntance VS實例方法
- 15. Java中的靜態方法
- 16. Java中的靜態方法
- 17. java中的靜態方法
- 18. 如何從mongoose中的實例方法訪問靜態方法?
- 19. 內存中的靜態方法和實例方法
- 20. Static Helper類與實例類的靜態方法vs擴展方法
- 21. java中的靜態方法可以調用非靜態方法
- 22. C#類實例的靜態方法VS靜態類的內存使用情況
- 23. 靜態方法是否可以調用Java中的實例方法
- 24. Java靜態方法VS功能
- 25. 在靜態方法中包裝單例實例方法是不好的?
- 26. 靜態抽象方法解決方法
- 27. Java:靜態方法中源自其他ArrayList的實例ArrayList
- 28. 如何在Java上的類實例上抑制靜態方法?
- 29. 如何在編寫靜態方法的junit時從靜態方法中模擬實例方法調用?
- 30. 需要在靜態和非靜態方法中使用實例
謝謝dlev。你能否稍微解釋一下你的陳述,即「注意,即使你不訪問實例變量,訪問實例方法也會使方法不能成爲靜態資格」 –
我的意思是如果你有一個方法不能訪問instnace狀態,如果它*調用另一個實例方法,它仍然不能是'靜態'。 – dlev
如何調用另一個實例方法使某個方法不成爲靜態資格?對不起,麻煩你了。請承擔我。 –