2012-08-29 13 views
5

Sezione 10.2 delle convenzioni Java raccomanda utilizzando i nomi delle classi invece di oggetti da usare variabili o metodi statici, cioè MyClass.variable1 o MyClass.methodName1() invece diconvenzione Java sul riferimento ai metodi e le variabili

MyClass Obj1 = new MyClass();  
Obj1.variable1; 
Obj1.methodName1(); 

Non v'è alcuna spiegazione della logica dietro a questo, anche se sospetto che questo abbia qualcosa a che fare con l'uso della memoria. Sarebbe bello se qualcuno potesse spiegarlo.

+2

Se il metodo è statico, chiamalo dalla classe stessa - è meno confuso. per esempio. 'BigInteger.ONE.valueOf (" 10 ")' confonde ciò che viene effettivamente fatto. – nhahtdh

risposta

8

Immagino tu intenda "per metodi e variabili statici".

Non c'è differenza per quanto riguarda la memoria, tranne ovviamente se si crea l'istanza solo per chiamare il metodo. Le convenzioni non sono per l'efficienza della memoria ma per l'efficienza del codificatore, che è direttamente correlata alla leggibilità del codice.

La logica è che leggendo

MyClass.methodName1() 

sai che è un metodo statico e che non può utilizzare o modificare l'istanza Obj1.

E se si scrive

obj1.variable1; // note the "o" instead of "O", please do follow conventions 

poi il lettore deve leggere il codice sorgente di sapere se variabile1 è statico o no.

+1

Post interessante sul perché può essere fonte di confusione: http://stackoverflow.com/a/1439847/829571 – assylias

+0

@assylias Esempio interessante, sì. –

+0

@dystroy: grazie, quindi l'idea principale è sapere subito se la variabile o il metodo è statico. – Alex

3

Se si utilizza l'oggetto per l'accesso con variabili statiche, il compilatore lo sostituirà solo con Class Name.

Così

MyClass Obj1 = new MyClass();  
Obj1.variable1; 
Obj1.methodName1(); 

è stesso

MyClass.variable1; 
MyClass.methodName1(); 

Now Why to differentiate? Answer is - It is for better reading If someone see method being called on Class then he immediately come to know that it is static method. Also it prevents generation of one additional object to access the method.

+0

Ma la prima versione chiamerà in genere MyClass '. Non so se il compilatore lo ottimizzi davvero, se init è banale. –

+0

@HeikoSchmitz [ "Quando il compilatore compila quella classe decide al momento della compilazione quale metodo esatto viene chiamata per ogni chiamata di metodo statico (questa è la grande differenza di metodo non statico chiama: il metodo esatto da chiamare è deciso solo in fase di esecuzione in questi casi "] (https://forums.oracle.com/forums/thread.jspa?threadID=1253445) –

+0

questo è chiaro. Tuttavia, il mio punto è che la prima versione include la costruzione di un'istanza di MyClass (compresi ctor, initializer, ecc), che può avere effetti collaterali e, quindi, non è la stessa della seconda versione, in cui non viene generato alcun oggetto: –

-1

variabile statica appartiene alla classe e non oggetto (istanza). Una variabile statica è accessibile direttamente dal nome della classe e non ha bisogno di alcun oggetto. risparmia spazio non dovendo avere variabili per gli stessi dati per ogni classe.

Syntax : <class-name>.<variable-name> 

public class AA{ 

static int a =10; 


} 

È possibile chiamare

System.out.println(AA.a); 
System.out.println(aObject.a); 

Non v'è alcuna differen tra due chiamate, ma mantenere la codifica convenzione per mantenere più formato leggibile

0

Questo ha a che fare con publicstatic metodi e variabili. Poiché questi metodi/variabili sono associate con la classe rispettiva anziché un'istanza della classe, è piacevole usare riferimento a tali metodi o variabili come className.methodName() o className.variableName

"Understanding Instance and Class Members" sarebbe un buon punto di partenza per conoscere l'uso della parola chiave static per creare campi e metodi che appartengono alla classe, piuttosto che a un'istanza della classe

0

È solo perché, il metodo statico pubblico o la variabile statica pubblica non è associato a nessun oggetto, ma alla classe.Sebbene il progettista di linguaggi abbia dato la flessibilità di invocarli su oggetti, il lettore del codice sarebbe confuso se questi siano variabili/metodi statici o metodi/variabili di istanza. Quindi la leggibilità è la ragione dietro la richiesta agli sviluppatori di invocarli su classi.

0

È possibile accedere ai membri statici utilizzando la notazione del nome della classe o accedendo utilizzando un oggetto. Non è consigliabile utilizzare la notazione dell'oggetto poiché può essere molto confuso.

public class TheClass { 
    public static final staticValue = 10; 
    public static void staticMethod() { 
     System.out.println("Hello from static method"); 
    } 

    public static void main(String ... args) { 
     TheClass obj = null; 

     // This is valid 
     System.out.println(obj.staticValue); 
     // And this too 
     System.out.println(obj.staticMethod()); 

     // And this is also valid 
     System.out.println(((TheClass)null).staticValue); 
     // And this too 
     System.out.println(((TheClass)null).staticMethod()); 

    } 
} 

E 'molto più chiaro se i metodi e le variabili statiche vengono chiamati con il nome della classe di notazione.

Problemi correlati