2017-07-25 16 views
0

我有一個包含Java中的公共靜態方法的類。在java中是否有任何註釋來警告子類不要使用相同的方法簽名(從而隱藏超類方法)。任何其他解決方法也可以。是否有任何註釋來警告子類不應該隱藏Java中的靜態方法

+0

的Eclipse(也可能是最重要的IDE)發出有關警告。除此之外,還有像[PMD](https://pmd.github.io/)這樣的靜態代碼分析工具,您可以將它們合併到構建過程中。 – Thomas

+1

@litelite你不能覆蓋靜態方法。 – Thomas

+0

您寫了「...不要使用相同的方法名稱...「 - 你的意思是你不僅要警告子類方法隱藏超類的方法,還要警告它_overloads_它(即不同的參數)? – Thomas

回答

2

只是要超類方法final

class Foo { 
    public static final void go() {} 
} 

class Bar extends Foo { 
    public static void go() {}; // Error 
} 

Ideone Example

+0

我誤解了'final'關鍵字不適用於靜態方法。現在想出來,謝謝。 – Jasir

0

你不需要這樣的註解,因爲什麼你試圖在不打算編辦......在Java

你就不能覆蓋靜態方法


爲@thomas建議(+ 1 dafuer),您可以用靜態方法 例子的知名度發揮:

public class Calculator { 

    static int add(int a, int b) { 
     System.out.println("a+b= " + (a + b)); 
     return a + b; 
    } 

    public static void main(String[] args) { 

    } 
} 

然後

public class ScientificCalculator extends Calculator { 

    public int add(int a, int b) { 
     System.out.println("11111"); 
     return a + b; 
    } 

} 
+2

你不能覆蓋他們,但你可以隱藏它們 – Thomas

+0

OP想要得到 –

+2

這就是他寫的:「java中是否有任何註釋來警告子類不要使用相同的方法名稱(並因此_隱藏超類method_)」 – Thomas

0

我不知道有任何這樣的註解來標記該方法的聲明。然而,你可以從相反的方向來解決這個問題。不要關注方法聲明,你可以看看它的用法。 -Xlint:all將發出警告,如果任何使用可能是一個問題。在其超類中具有與靜態方法相同簽名的靜態方法只會在該方法從實例引用而不是靜態時引發問題。考慮下面的例子:

public class Foo { 

    public static String getFoo(){ 
    return "foo"; 
    } 
} 

public class Bar extends Foo { 

    public static void main(String[] args){ 

    Bar bar = new Bar(); 
    String s = bar.getFoo(); // Actually calls Foo.getFoo() 
    System.out.println(s); // Prints "foo" 

    } 
} 

在上面的代碼中,我們通過的Bar實例引用從Foo靜態getFoo()方法。 bar.getFoo()行實際上調用Foo的靜態方法。現在假設我們有相同的簽名Bar添加靜態方法:

public class Bar extends Foo { 
    public static String getFoo(){ 
     return "bar"; 
    } 

    public static void main(String[] args){ 

    Bar bar = new Bar(); 
    String s = bar.getFoo(); // Actually calls Bar.getFoo() 
    System.out.println(s); // Prints "bar" 

    } 
} 

這個隱藏BarFoo.getFoo()方法現在Bar.getFoo()方法,而不是調用。在真實情況下,這幾乎肯定會突破Bar。如果用-Xlint:all選項編譯,那麼你會得到這樣的信息:

warning: [static] static method should be qualified by type name, Foo, instead of by an expression

你會注意到這一點,當你編譯Bar的第一個版本,你可以把它固定到String s = Foo.getFoo()的時候了。之後當getFoo也被添加到Bar時,原始代碼仍然可以工作,因爲它明確引用了Foo中的方法。如果您總是通過引用聲明它們的類來顯式調用靜態方法,那麼在子類中使用相同方法的唯一問題就是它不完全是最佳實踐。也許有一種方法可以標記聲明,但我會專注於確保正確使用靜態方法。

相關問題