2011-08-26 151 views
4

根據我的理解,我們應該只在處理對象狀態(即實例變量)時才使用方法。如果方法處理對象的狀態,它們應該總是被聲明爲類方法,即靜態的。但仍然在大多數項目中 我已經看到了從未對實例變量進行操作的方法,它們也被聲明爲實例方法(基本上這些方法正在做什麼,它們正在使用某些方法參數並對該部分做了一些處理,調用其他類)。這就是它。 不應該將這些方法聲明爲類方法,即靜態嗎?在java中的靜態方法vs實例方法的決定?

回答

7

這是有可能的答案是肯定的:如果你有沒有采取實際的實例狀態的優勢的實例方法,那麼它也許應該是static,並可能轉移到這取決於它的輔助類確實。

請注意,即使您不訪問實例變量,訪問實例方法也會使方法不能成爲static。另外,如果這個方法是一個實例方法,以便將來能夠抵抗它(預期稍後使用實例狀態),那麼改變它也不是可取的。

同樣重要的是公共非靜態方法可以被子類繼承和重寫,因此使它們實際上可能以意想不到的方式破壞代碼。

+0

謝謝dlev​​。你能否稍微解釋一下你的陳述,即「注意,即使你不訪問實例變量,訪問實例方法也會使方法不能成爲靜態資格」 –

+0

我的意思是如果你有一個方法不能訪問instnace狀態,如果它*調用另一個實例方法,它仍然不能是'靜態'。 – dlev

+0

如何調用另一個實例方法使某個方法不成爲靜態資格?對不起,麻煩你了。請承擔我。 –

1

你不能指望每個人都始終遵循一條道路,無論是否是最佳實踐。首先,我們都是人類。我們可以選擇一種有時不同的方式,而這種方式不應該一直是完全正確的。即使框架和圖書館和語言是由人類創建的,所以錯誤不應該讓你感到驚訝,也不會讓你感到困擾。

對於其他一切,我同意dlev。

+0

這是一個很好的觀點,人們會犯錯誤。有一個實例方法通常不是什麼大事,它可能是「靜態」的,實際上它總是發生。 – dlev

7

這裏有一個[可能不完整]列表時,必須使用實例方法在靜態的:

  • 訪問實例變量/從方法
  • 方法中的方法是,你實現
  • 抽象方法
  • 的方法是,你實現
  • 您對方法的懷疑在長期停留靜態接口方法
  • 聲明它​​並且不想鎖定班級,而是鎖定實例
  • 您以非靜態方式訪問靜態方法時會收到警告,並且您真的關心它們(有時您無法避免在非所以你唯一的選擇是讓他們的方法是非靜態的)

你可能在所有其他情況下可以靜態。

3

靜態方法的缺點是它們將調用者與實現緊密耦合。實例方法可以被重寫,也可以是接口方法的多個實現之一。

換句話說,實例方法可以促進鬆耦合,可測試性和重用。

0

假設我們正在設計一種新語言,我們希望Sqrt是一個實例方法。所以我們看一下雙人班並開始設計。它顯然沒有輸入(除了實例)並返回一個double。我們編寫和測試代碼。完美。

但是,取整數的平方根也是有效的,我們不希望強制每個人都轉換爲雙精度來取平方根。所以我們轉向int並開始設計。它返回什麼?我們可以返回一個int並使其僅適用於完美平方,或將結果四捨五入到最接近的整數(忽略關於現在正確舍入方法的爭論)。但是如果有人想要一個非整數結果呢?我們是否應該有兩個方法 - 一個返回一個int,一個返回double(這在某些語言中不可能改變名稱)。所以我們決定它應該返回一倍。現在我們執行。但是這個實現和我們用於double的實現是一樣的。我們是否複製並粘貼?我們是否將該實例轉換爲double並調用該實例方法?爲什麼不把邏輯放在可以從兩個類中訪問的庫方法中。我們將調用庫Math和函數Math.Sqrt。