2014-09-04 17 views
5

Nei miei precedenti anni di sviluppo in C++, so che era una convenzione per inizializzare sempre le variabili con qualcosa.Assegnazione iniziale Java

Ho portato con me questa convenzione in Java e in realtà qualsiasi altro linguaggio di programmazione che utilizzo.

Io uso IntelliJ IDEA, e io sono completamente soddisfatto, e di solito seguo le sue linee guida di programmazione e le avvertenze, però ho ottenuto questo avvertimento:

public String getText(By by) { 
    String text = null; // Variable `text` initializer `null` is redundant 

    WebElement ele = findElement(by); 
    highlightIfDemoMode(ele); 

    String tagName = ele.getTagName(); 
    if (tagName.equals("input") || 
     tagName.equals("select")) 
     // For field elements, the text is actually held in values, not the text. 

     text = ele.getAttribute("value"); 
    else 
     text = ele.getText(); 

    return text; 
} 

Ora, ovviamente, in Java,

String text; 
// is the *exact* same thing as.. 
String text = null; 

Considerando che IntelliJ è molto bravo a seguire le convenzioni di programmazione, dovrei trascurare quella mia convenzione per non inizializzare le mie variabili come questa in Java? Sento che è molto più pulito, ma se le convenzioni Java mi dicono di non farlo, non lo farò.

Qualcuno potrebbe dirmi se è meglio la pratica per inizializzare, o semplicemente dedurre che si tratta di nulla

risposta

4

Una differenza compilatore è

String text; 
text.toString(); 

È un errore di compilazione.

String text = null; 
text.toString(); 

compila, ma è un errore di runtime.

Gli errori di compilazione sono migliori degli errori di runtime. Non dichiarando la tua variabile fino a che non hai un valore per esso è migliore di entrambi, ma a volte impossibile.

int x; 
try(SQLRunner runner = new SQLRunner(connectionPool) { 
    x = runner.getX(); 
} 

È necessario. Prendi in considerazione le variabili finale in questo caso. Questa è comunque una buona pratica quando possibile, ma personalmente la trovo troppo prolissa e non utile a dichiarare ogni variabile locale che non cambierà come finale. Questa è un'eccezione perché int x; mi dice che cambierà in seguito senza dirmi quanto cambierà.

final int x; 
+0

Nota comunque che puoi estrarre il costrutto in un metodo separato ed evitare questo modello piuttosto brutto. – biziclop

+1

@biziclop è possibile estrarre qualsiasi cosa in un metodo separato per evitare qualsiasi modello (ad esempio, double-nested per i loop con un'interruzione di apertura). Penso che sia ragionevole non voler scomporlo, specialmente se lo si vuole visivamente ovvio dal metodo di primo livello quando si estrapolano le connessioni. – djechlin

+0

Mi è stato detto che fare una variabile 'final' permette al compilatore/JVM di fare alcune ottimizzazioni che non potrebbe fare altrimenti, come ad esempio l'inlining? – Stewart

4

Secondo Effective Java è cattiva pratica di dichiarare e inizializzare le variabili locali prima del loro primo utilizzo. (E secondo me anche io non sono molto autorevole.)

L'idea è di mantenere il loro raggio d'azione il più stretto possibile, migliora la leggibilità e impedisce il riutilizzo accidentale.

+0

che ha senso. tuttavia, non so se ho avuto un'istanza in cui ho "riutilizzato accidentalmente" un campo. – sircapsalot

+0

@sircapsalot Di solito è un risultato di taglia-e-incolla, che è una cattiva pratica in sé. – biziclop

1

Il seguente frammento è un errore di compilazione Java:

Integer integers[] = {}; 
    Integer max; 
    for (Integer i : integers) { 
     if (max == null || i > max) max = i; 
    } 

L'errore in Eclipse è "La massima variabile locale non sia stato inizializzato".

Quindi è necessario inizializzare max a null.

Mi chiedo che cosa dice Intellij ...

+1

Non è Eclipse che io sappia, è un compilatore Java. (è passato abbastanza tempo da quando ho compilato con javac potrei sbagliarmi.) – djechlin

+0

Potrebbe benissimo essere. Anche Eclipse ha il suo compilatore. Mi chiedo che cosa intelliJ? – Arkadiy

+0

Giusto, stavo cercando di pensare ad un esempio di quando sarebbe necessario, e questa è una di quelle volte .. dalle altre risposte, sembra che il modo migliore sia non inizializzare .. ma queste cose potrebbero insinuarsi su, e mi piace che le cose siano uniformi .. se devo farlo qui, mi piacerebbe * farlo * ovunque altrove – sircapsalot

0

variabili di metodo locali non vengono inizializzati per impostazione predefinita, si sta pensando di campi di classe.Indipendentemente da ciò, eliminerei completamente la variabile locale text,

public String getText(By by) { 
    WebElement ele = findElement(by); 
    highlightIfDemoMode(ele); 
    String tagName = ele.getTagName(); 
    if (tagName.equals("input") || tagName.equals("select")) { 
    return ele.getAttribute("value"); 
    } 
    return ele.getText(); 
}