2016-04-26 13 views
6

Nel codice sorgente di Android vedo che definiscono quattro variabili comeInizializza int a 0 o no?

protected int mPaddingRight = 0; 
protected int mPaddingLeft = 0; 
protected int mPaddingTop; 
protected int mPaddingBottom; 

In Java, qual è la differenza di inizializzazione di una variabile a 0 o no? Non capisco che in alcuni compilatori non posso fare un confronto a meno che non inizializzi il campo. Ma non è questo il caso. Questo ha a che fare con l'ottimizzazione? O è solo una pratica di codifica incoerente/errata?

+2

Nessuna differenza: i membri int sono inizializzati a zero per impostazione predefinita. –

+1

Inizializzerei comunque a '0' se volessi che fossero 0, comunque. E dal momento che lo faccio, dovresti farlo anche tu! – Gendarme

risposta

8

Secondo Java primitive data types turorial, tutti i tipi di dati primitivi hanno un valore predefinito. Quindi l'inizializzazione è implicita. Una buona pratica: inizializzare i valori prima dell'uso per prevenire comportamenti imprevisti.

byte 0 
short 0 
int 0 
long 0L 
float 0.0f 
double 0.0d 
char '\u0000' 
String (or any object)  null 
boolean false 
+0

Wow, molte grandi risposte. Quindi scelgo i voti più vecchi e quelli più alti. –

1

Come notato nei commenti, non v'è alcuna differenza. Saranno initalizzati con 0 implicitamente. Tuttavia, se si utilizza un buon IDE o hanno altri strumenti, sarebbe davvero facile per voi per cercare e sostituire = 0; con = SomeOtherValueHere;.

Inoltre penso che sia una buona pratica per initialzie sempre le variabili prima di accedere.

1

Si tratta di una buona pratica di codifica per inizializzare le variabili.

da Oracle Documenti:

Non è sempre necessario assegnare un valore quando un campo viene dichiarato. I campi dichiarati ma non inizializzati verranno impostati su un valore ragionevole predefinito da dal compilatore. In generale, questa impostazione predefinita sarà zero o nullo, a seconda del tipo di dati. Basandosi su tali valori di default, tuttavia, è generalmente considerato cattiva programmazione stile.

I vantaggi di inizializzazione delle variabili sono i seguenti:

  1. rende più facile seguire il codice
  2. rende la vita più facile per gli strumenti di analisi statica.
  3. La maggior parte dei modelli di progettazione prevalenti richiede di inizializzare la variabile su un valore predefinito, in modo che il programmatore sappia esattamente a quale valore viene inizializzata la variabile.
  4. È sempre buona norma inizializzare le variabili per impedire comportamenti non definiti più avanti nel programma.
  5. Il debug diventa più semplice se si inizializzano le variabili.
+0

Hmm. Qui non c'è esattamente un "comportamento indefinito". Tutto ben specificato. Anche gli strumenti di analisi statica possono occuparsi di questo. – Thilo

0

Altri hanno sottolineato che le proprietà di classe sono inizializzate su valori predefiniti.

Quindi, semanticamente, non v'è alcuna differenza se si imposta in modo esplicito a 0 (o, per le proprietà degli oggetti, impostare quelli su null.)

Tuttavia, ci possono essere infatti una differenza a livello di bytecode. Non vi è alcuna garanzia che il codice che differisce solo nelle proprietà di classe che sono implicitamente o esplicitamente impostate sui valori predefiniti avrà esattamente lo stesso bytecode.

Versioni precedenti di JDK utilizzate per generare codice più grande e più lungo per l'inizializzazione esplicita, che era facile da verificare con javap. (Questo fatto è stato occasionalmente utilizzato come base per le domande dell'intervista.) Non ho controllato le versioni recenti del JDK per vedere se questo è ancora il caso.

+0

Per quanto riguarda il fatto che _should_ inizializzi le proprietà della classe in questo modo, anche con i loro valori predefiniti già noti, questo sta calpestando il territorio della guerra santa. I miei sentimenti sono che gli inizializzatori di default espliciti sono noise e dovrebbero essere omessi. Se una proprietà ha bisogno di un inizializzatore non predefinito, e il progetto non vuole inizializzatori o costruttori statici (per qualsiasi motivo), suppongo che si possa fare questo finché ci sono commenti sul perché vengono usati i valori magici. Tuttavia, ogni negozio Java a cui ho lavorato non l'ha mai fatto. Questi sviluppatori di C#, tuttavia, inizializzano _qualcosa. – jdv

+0

Codice più lungo per l'initalizzazione esplicita? E pensavo di conoscere Java: D –