java - method教學 - static method python




Java:何時使用靜態方法 (14)

我想知道什麼時候使用靜態方法?

  1. static方法的一個常見用途是訪問static字段。
  2. 但是你可以有static方法,而不需要引用static變量。 沒有引用static變量的Helper方法可以在java.lang.Math等java類中找到

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
    
  3. 另一個用例是,我可以將這些方法與synchronized方法結合起來,就是在多線程環境中實現類級鎖定。

假如我有一個有幾個getter和setter的類,一個或兩個方法,我希望這些方法只能在類的實例對像上調用。 這是否意味著我應該使用靜態方法?

如果你需要訪問類的實例對象的方法,你的方法應該是非靜態的。

Oracle文檔page提供了更多細節。

並非所有實例和類變量和方法的組合都是允許的:

  1. 實例方法可以直接訪問實例變量和實例方法。
  2. 實例方法可以直接訪問類變量和類方法。
  3. 類方法可以直接訪問類變量和類方法。
  4. 類方法不能直接訪問實例變量或實例方法 - 它們必須使用對象引用。 另外,類方法不能使用this關鍵字,因為沒有實例可以引用它。

我想知道什麼時候使用靜態方法? 假如我有一個有幾個getter和setter的類,一個或兩個方法,我希望這些方法只能在類的實例對像上調用。 這是否意味著我應該使用靜態方法?

例如

Obj x = new Obj();
x.someMethod

要么

Obj.someMethod

(這是靜態的方式?)

我很困惑!


java中的靜態方法屬於類(不是它的一個實例)。 他們不使用實例變量,通常會從參數中獲取輸入,對其執行操作,然後返回一些結果。 實例方法與對象相關聯,顧名思義,可以使用實例變量。


一個經驗法則是:問問自己“調用這個方法是否合理,即使沒有構造Obj?” 如果是這樣,它肯定應該是靜態的。

所以在Car類中,你可能會有一個double convertMpgToKpl(double mpg) ,它可能是靜態的,因為人們可能想知道35mpg轉換成什麼,即使沒有人構建過Car。 但是void setMileage(double mpg) (設置一個特定Car的效率)不能是靜態的,因為在任何Car構造之前調用該方法是不可想像的。

(順便說一句,反過來並不總是正確的:你有時可能有一個涉及兩個Car對象的方法,並且仍然希望它是靜態的,例如Car theMoreEfficientOf( Car c1, Car c2 ) 。雖然這可以轉換為非靜態版本,有人會認為,既然沒有“特權”選擇哪個車更重要,你不應該強迫呼叫者選擇一個車作為你調用該方法的對象。儘管如此,對於所有靜態方法的一小部分)。


不,靜態方法不與一個實例關聯; 他們屬於這個班級。 靜態方法是你的第二個例子; 實例方法是第一個。


在eclipse中,你可以啟用一個警告來幫助你檢測潛在的靜態方法。 (突出顯示的行上方是另一個我忘記強調的行)


在閱讀Misko的文章後,我認為從測試的角度來看, 靜態方法是不好的。 你應該有factories而不是(可能使用像Guice這樣的依賴注入工具)。

我如何確保我只有一件事

只有一件事“我如何確保我只有一件東西”的問題很好地被迴避了。 你只在你的main中實例化一個ApplicationFactory,結果你只實例化所有單例的一個實例。

靜態方法的基本問題是它們是程序代碼

靜態方法的基本問題是它們是程序代碼。 我不知道如何對程序代碼進行單元測試。 單元測試假定我可以孤立地實例化我的一個應用程序。 在實例化過程中,我使用mocks / friendlies替換真正的依賴關係。 通過程序編程,沒有任何東西可以“連線”,因為沒有對象,代碼和數據是分開的。


實際上,我們在一個類中使用靜態屬性和方法,當我們想要使用我們的程序的某些部分時,應該存在,直到我們的程序運行。 我們知道,為了操作靜態屬性,我們需要靜態方法,因為它們不是實例變量的一部分。 而沒有靜態方法,操縱靜態屬性是非常耗時的。


應該在類上調用靜態方法,應該在類的實例上調用實例方法。 但是這實際上意味著什麼呢? 這是一個有用的例子:

汽車類可能有一個名為Accelerate()的實例方法。 如果汽車實際存在(已經建成),那麼只能加速汽車,因此這將是一種實例方法。

汽車類也可能有一個稱為GetCarCount()的計數方法。 這將返回創建(或構建)的汽車總數。 如果沒有車被構建,這個方法會返回0,但它仍然可以被調用,因此它必須是一個靜態方法。


當您希望能夠在沒有該類的實例的情況下訪問該方法時,請使用靜態方法。


靜態方法不需要在對像上調用,也就是在您使用它時。 例如:你的Main()是一個靜態的,你不會創建一個對象來調用它。


靜態方法和變量是Java中'Global'函數和變量的受控版本。 在哪些方法可以作為classname.methodName()classInstanceName.methodName()來訪問,即靜態方法和變量可以使用類名稱以及類的實例來訪問。

類不能被聲明為靜態的(因為它是沒有意義的,如果一個類聲明為public,它可以從任何地方訪問),內部類可以聲明為靜態的。


靜態方法在類的所有實例之間共享,開發人員通常使用靜態關鍵字與實用程序方法,這些方法執行應用程序中任何位置常用的常用功能。

如果以下條件適用,則使您的方法靜態:

  1. 您的方法具有常用於整個應用程序的常用功能。
  2. 你的方法不使用實例變量。
  3. 你的方法接受輸入作為參數,做一些常用的功能,然後返回一些結果。

PS:值得一提的是,嘲諷靜態方法非常困難甚至(不可能),嘲笑是單元測試中用來偽造某些方法的業務的一種機制。

有關更多詳細信息,請在java中檢查: Static關鍵字


靜態方法有兩個主要目的:

  1. 對於不需要任何對象狀態的實用程序或幫助程序方法。 由於不需要訪問實例變量,因此使用靜態方法就不需要調用者實例化對象,只需調用該方法即可。
  2. 對於類的所有實例共享的狀態,如計數器。 所有實例必須共享相同的狀態。 僅僅使用該狀態的方法也應該是靜態的。

靜態方法與實例無關,所以它們不能訪問類中的任何非靜態字段。

如果方法不使用類的任何字段(或僅使用靜態字段),則可以使用靜態方法。

如果使用某個類的任何非靜態字段,則必須使用非靜態方法。





static-methods