2014-10-02 23 views
8

In Java, qual è la differenza e il modo migliore di fare?Differenza tra la variabile locale initialize null e non initialize?

Integer x = null; // x later assign some value. 
Integer y; // y later initialize and use it. 
+2

La differenza è che il compilatore impedisce la lettura della variabile non inizializzata. –

+1

Dipende se vuoi che sia inizializzato su 'null' o se vuoi assicurarti di dover inizializzarlo più tardi prima di poterlo usare. – khelwood

+0

Questo non è chiaro. Hai detto "variabile", vuoi veramente * dire * "variabile"? La risposta è molto diversa per i membri di esempio, che alcune persone chiamano genericamente "variabili di istanza", piuttosto che per le variabili reali. –

risposta

7

La risposta dipende dal tipo di variabile che si sta riferendo.

Per variabili di classe, non c'è alcuna differenza, vedere la JLS - 4.12.5. Initial Values of Variables:

... Ogni variabile in un programma deve avere un valore prima il suo valore è usato:

Per ogni riferimento tipi (§4.3), il valore predefinito è null.

Significato, non vi è alcuna differenza, il successivo è implicitamente impostato su null.

Se le variabili sono locali, che deve essere assegnato prima di passare ad un metodo:

myMethod(x); //will compile :) 
myMethod(y) //won't compile :(
3

Nessuna differenza. In entrambi i casi, quando si desidera utilizzarlo, la variabile locale deve essere in forma inizializzata (deve avere un valore).

Da Java doc

Simile a come un oggetto memorizza il suo stato nei campi, un metodo spesso memorizzare il suo stato temporaneo in variabili locali. La sintassi per che dichiara una variabile locale è simile alla dichiarazione di un campo (per l'esempio , conteggio int = 0;). Non esiste una parola chiave speciale che designa una variabile come locale; tale determinazione proviene interamente dalla posizione in cui viene dichiarata la variabile, che si trova tra l'apertura e le parentesi di chiusura di un metodo di . Come tali, le variabili locali sono visibili solo da ai metodi in cui sono dichiarate; non sono accessibili dal resto della classe.

+7

C'è una differenza. Se lo hai già impostato a 'null', puoi passare' x' a un metodo come 'null' senza riassegnarlo. Se non l'hai ancora assegnato, il compilatore non ti permetterà di usarlo finché non lo farai. – khelwood

+2

@khelwood Alla fine non sto dicendo alcuna differenza. –

3

il suo meglio per non impostare a NULL, altrimenti si può per caso usarlo e causare NPE . Il compilatore non ti aiuterà con l'errore di compilazione. Solo impostato a null se si vuole avere la logica, come se (x! = Null) {/ usano /}

3

variabili locali deve essere assegnato a qualcosa prima di essere utilizzate.

Integer x = null; 
myFunction(x); 
// myFunction is called with the argument null 

Integer y; 
myFunction(y); 
// This will not compile because the variable has not been initialised 

variabili di classe sono sempre inizializzati ad un valore di default (null per tipi di oggetto, qualcosa di simile a zero per le primitive), se non li inizializza in modo esplicito. Le variabili locali non sono inizializzate implicitamente.

1

Nessuna differenza è prevista per una cosa, se non la si inizializza e più tardi si tenta di utilizzare questa variabile (senza modificare il riferimento) significa un errore in fase di compilazione, ma se si inizializza e si utilizza in seguito (senza modificare il riferimento) si intende una NullPointerException.

Ti mostro un esempio.

senza inizializzare

Integer y; 
y.intValue(); // Compilation error 

Con l'inizializzazione

Integer x = null; 
x.intValue(); // You are able to compile it but NullPointerException 
1

Internamente non v'è alcuna differenza. Inoltre è un argomento discutibile.

Utilizzare la variabile locale solo se è realmente necessaria. Le variabili locali sono per lo più nei seguenti scenari (potrebbe mancare qualche altro).

come abbreviazione o per leggibilità

Integer myObject = someObject.someFunction().someOtherFunction(); 

Se usiamo la sintassi del genere in molti luoghi, il codice diventerà goffo.

per l'accessibilità

Object returnObject = null;  
if(mycondition) 
{ 
    returnObject = value1; 
} 
else if(secondCondition) 
{ 
    returnObject = value2; 
} 

return returnObject; 

Il chiamante del frammento di codice di cui sopra avrà decisione sulla base del valore di ritorno. Onestamente non vedo altro caso d'uso valido per dichiarare una variabile senza valore iniziale.

Conclusione (Best Practice):

  • Dichiarare variabile locale solo se necessario
  • creano sempre variabile locale con valore di default.
Problemi correlati