2010-04-23 58 views
5

如果我用Java創建一個類的實例,爲什麼最好是靜態調用同一個類的靜態方法,而不是使用this.method()?爲什麼最好從方法的類的實例中靜態地調用靜態方法?

當我嘗試通過this.staticMethod()從自定義類的構造函數中調用靜態方法staticMethod()時,我從Eclipse獲得警告。

public MyClass() { this.staticMethod(); } 

VS

public MyClass() { MyClass.staticMethod(); } 

任何人都可以解釋爲什麼這是一個糟糕的事是什麼?在我看來,編譯器應該已經分配了對象的一個​​實例,所以靜態分配內存將是不必要的開銷。

編輯:

什麼,我聽到的要點是,這是不好的做法,主要是因爲可讀性的,也是可以理解的。我真正想要問的是(雖然不是很清楚)是在調用MyClass.staticMethod()或this.staticMethod()之間有什麼區別。

回答

6

MyClass.staticMethod()清楚地表明您正在調用靜態(不可重寫)方法。

this.staticMethod()誤導讀者認爲它是一種實例方法。

staticMethod()也是誤導性的一面(儘管我通常這樣做)。

如果你認爲讀取你的代碼的人不熟悉它,你會試圖使代碼更清晰,並且通過使用ClassName.method而不是instance.method代碼更加清晰。

2

由於this.通常引用實例方法,因此,這是一個壞主意。

11

靜態方法不依賴於類的一個實例,所以意義不大從this調用它,而不是從Class.staticMethod()打電話,更可讀了。

3

靜態方法實際上不是你的實例的一部分 - 它無論如何都不能訪問任何實例變量,所以我敢想它從構造函數中調用它並沒有多大意義。

如果您需要初始化靜態對象使用

private static List l = new ArrayList(); static { l.add("something"); } 

如果您仍然需要調用它的完全合法的調用本地靜態方法沒有前綴的本地類的名​​字,像這樣(沒有日食警告)

public MyClass() { staticMethod(); } 
5

除了其他答案已經提到明確指出你正在使用靜態方法,還要注意靜態方法不是多態的,所以使用類名明確可以消除任何混淆,關於哪種方法是將被稱爲。

在下面的代碼,它不是完全明顯,b.test()是否會返回一個「A」,如果你期待一個非靜態方法的多態性:

public class TestStaticOverride 
{ 
    public static void main(String[] args) 
    { 
    A b = new B(); 
    System.out.println("Calling b.test(): " + b.test()); 
    } 

    private static class A 
    { 
    public static String test() { return "A"; } 
    } 

    private static class B extends A 
    { 
    public static String test() { return "B"; } 
    } 
} 

如果你的代碼更改爲B b = new B();它會打印出「B」。

(無論是以往任何時候都「越權」靜態方法可能是另一天的討論......是個好主意)

+0

不重寫靜態方法,你隱藏起來。覆蓋意味着多態性,這是靜態方法所不具備的。 – TofuBeer 2010-04-23 03:59:18

+0

@TofuBeer謝謝,我的術語不夠精確。從某人在靜態方法中使用'this'的角度來看,這可能意味着某種形式的多態性意圖,而這種意圖不起作用。 – Ash 2010-04-23 04:16:11

相關問題