2011-10-25 10 views
9

In una recente domanda, qualcuno ha chiesto informazioni sui metodi statici e una delle risposte ha dichiarato che in genere li chiami con qualcosa di simile:Sta chiamando metodi statici tramite un oggetto "cattivo formato"? Perché?

MyClassName.myStaticMethod(); 

I commenti su che anche affermato che si potrebbe anche chiamare tramite un oggetto con :

MyClassName myVar; 
myVar.myStaticMethod(); 

ma che è stata considerata cattiva forma.

Ora a me sembra che questa operazione può effettivamente rendere la mia vita più facile in modo da non dover preoccuparsi su ciò che è statico o non (a).

c'è qualche problema con la chiamata di funzioni statiche tramite un oggetto? Ovviamente non si vuole creare un nuovo oggetto solo chiamarlo:

Integer xyzzy; 
int plugh = xyzzy.parseInt ("42", 10); 

Ma, se si dispone già di un oggetto del tipo desiderato, c'è un problema in usando esso?


(a) Ovviamente, non può chiamare un metodo non-statico con:

MyClassName.myNonStaticMethod(); 

ma non è questo il problema che sto chiedendo qui.

+1

Vedere questa risposta SO per informazioni http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an-error-for-the -java-co/610674 # 610674 –

+0

Quando leggo il codice e c'è una chiamata a un metodo, per me è ** molto ** rilevante per essere in grado di dire subito che quella chiamata non può leggere né modificare lo stato dell'oggetto appartiene a. Con 'MyClassName.myStaticMethod();' non c'è nemmeno bisogno di chiedersi per un secondo. Con 'myVar.myStaticMethod();' hai bisogno di vedere il codice del metodo e sarai sempre in dubbio per tutte le chiamate. Ovviamente IDE diversi potrebbero rendere queste informazioni facili da recuperare (tooltip Javadoc, evidenziazione della sintassi, ecc.) Ma non mi affiderei a questo per decidere come scrivere il codice. – SantiBailors

risposta

14

La forma commento negativo viene dalle convenzioni di codifica per Java

Vedi http://www.oracle.com/technetwork/java/codeconventions-137265.html#587

La ragione per questo, se si pensa a questo proposito, è che il metodo, essendo statica, non si appartengono a qualsiasi oggetto particolare. Perché appartiene alla classe, perché vorresti elevare un particolare oggetto a uno stato così speciale che sembra possedere un metodo?

In vostro particolare esempio, si può utilizzare un intero esistente attraverso il quale chiamare parseInt (vale a dire, è legale in Java), ma che pone l'attenzione del lettore su quel particolare oggetto intero. Può essere fonte di confusione per i lettori, quindi la guida è di evitare questo stile.

Per questo, semplificando la vita del programmatore, girarlo e chiedere cosa rende la vita più facile sul lettore ? Esistono due tipi di metodi: istanza e statico. Quando vedi un'espressione C.m e sai che C è una classe, sai che m deve essere un metodo statico. Quando vedi x.m (dove x è un'istanza) non puoi dirlo, ma assomiglia a un metodo di istanza e così molti utenti riservano questa sintassi solo per i metodi di istanza.

3

Potrebbe diventare molto confuso quando si ha un oggetto che eredita da un altro oggetto, sovrascrivendo il suo metodo statico. Soprattutto se ti riferisci all'oggetto come a un tipo della sua classe antenata. Non sarebbe ovvio per quale metodo stai correndo.

+1

Se quel "super confusione" fosse un gioco di parole, dovrò venire a darti un pò di scherno :-) – paxdiablo

+0

@paxdiablo Vorrei averlo fatto ... sarebbe stato abbastanza buono. – bdares

4

È una questione di comunicazione. Chiamare un metodo su un'istanza implica in cui stai agendo su/con quella particolare istanza, non su/con la classe dell'istanza.

20

A mio parere, il vero caso d'uso che rende questo così illeggibile è qualcosa del genere. Cosa stampa il seguente codice?

La risposta è che stampa "Super", perché i metodi statici non sono virtuali. Anche se instance è-a Sub, il compilatore può solo andare sul tipo della variabile che è Super. Tuttavia, chiamando il metodo tramite instance anziché Super, stai sottintendendo implicitamente che sarà virtuale.

In effetti, uno sviluppatore che legge instance.method() dovrebbe esaminare la dichiarazione del metodo (la sua firma) per sapere quale metodo viene effettivamente chiamato. Lei parla di

mi sembra che facendo questo può effettivamente rendere la mia vita più facile in modo che non devi preoccuparti di ciò che è statico o non

Ma nel caso di cui sopra contesto è in realtà molto importante !

Posso tranquillamente dire che è stato un errore per i progettisti di linguaggio consentire questo in primo luogo. Stai lontano.

+1

+1 Ho convenuto che si è trattato di un errore (IMHO). E un bel esempio a proposito. –

Problemi correlati