2010-04-23 14 views
5

Se creo un'istanza di una classe in Java, perché è preferibile chiamare staticamente un metodo statico di quella stessa classe piuttosto che usare this.method()?Perché è preferibile chiamare staticamente un metodo statico all'interno di un'istanza della classe del metodo?

Viene visualizzato un avviso da Eclipse quando provo a richiamare il metodo statico staticMethod() dal costruttore della classe personalizzata tramite this.staticMethod().

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

vs

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

qualcuno può spiegare il motivo per cui questa è una cattiva cosa da fare? Mi sembra che il compilatore avrebbe già dovuto assegnare un'istanza dell'oggetto, quindi l'allocazione statica della memoria sarebbe un sovraccarico non necessario.

EDIT:

Il nocciolo di quello che sto sentendo è che questo è cattiva pratica soprattutto a causa della leggibilità, e comprensibilmente. Quello che stavo veramente cercando di chiedere (anche se non molto chiaramente) era quali differenze ci siano nella "compilazione", se ce ne sono, tra chiamare MyClass.staticMethod() o this.staticMethod().

risposta

6

MyClass.staticMethod() indica chiaramente che si sta chiamando un metodo statico (non sovrascrivibile).

this.staticMethod() induce il lettore a pensare che si tratti di un metodo di istanza.

staticMethod() è anche sul lato fuorviante (anche se normalmente lo faccio in questo modo).

Se pensate che le persone che leggono il vostro codice non hanno familiarità con esso, tendete a provare a rendere il codice più chiaro, e questo è un caso in cui il codice è più chiaro avendo ClassName.method invece di instance.method.

2

Poiché this. normalmente fa riferimento a metodi di istanza, pertanto, è una cattiva idea farlo.

11

I metodi statici non sono legati a un'istanza della classe, quindi ha meno senso chiamarlo da un this piuttosto che chiamare da Class.staticMethod(), molto più leggibile anche.

3

I metodi statici non fanno realmente parte dell'istanza e non potranno accedere a nessuna delle variabili di istanza in ogni caso, quindi oserei pensare che non abbia molto senso chiamarlo dal costruttore.

Se la vostra necessità per inizializzare oggetti statici utilizzano

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

Se hai ancora bisogno di chiamare la sua perfettamente legale per chiamare i metodi locali statiche senza prefisso tuo nome classe locale, come questo (nessun avviso eclisse)

5

In aggiunta alle altre risposte che hanno indicato che si sta utilizzando un metodo statico, si noti anche che i metodi statici non sono polimorfici, quindi essere espliciti con il nome della classe può eliminare qualsiasi confusione su quale metodo sia sarà chiamato.

Nel codice qui sotto, non è del tutto ovvio che b.test() sta per tornare "A" se vi aspettate il polimorfismo di un metodo non statico:

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"; } 
    } 
} 

Se si modifica il codice per B b = new B(); stamperà "B".

(Che si tratti di mai una buona idea di "ignorare" i metodi statici è probabilmente una discussione per un altro giorno ...)

+0

Non sostituire i metodi statici, li nascondono. L'override implica il polimorfismo, che non si ottiene con i metodi statici. – TofuBeer

+0

@TofuBeer grazie, non ero abbastanza preciso nella mia terminologia. Dal punto di vista di qualcuno che usa 'this' su un metodo statico, potrebbe implicare una sorta di intenzione per il polimorfismo, che non funzionerà. – Ash

Problemi correlati