2014-09-04 7 views
5

In meinen früheren Jahren der Entwicklung in C++, weiß ich, dass es eine Konvention war, Ihre Variablen immer mit etwas zu initialisieren.Java erste Zuordnung

Ich habe diese Konvention mit mir nach Java getragen, und wirklich jede andere Programmiersprache, die ich benutze.

Ich benutze IntelliJ IDEA, und ich bin ganz zufrieden damit, und in der Regel seine Programmierrichtlinien und Warnungen folgen, jedoch habe ich diese Warnung:

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; 
} 

Jetzt offensichtlich, in Java,

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

Wenn man bedenkt, dass IntelliJ sehr gut darin ist, Programmierkonventionen zu befolgen, sollte ich diese Konvention von mir vernachlässigen, um meine Variablen nicht in Java zu initialisieren? Ich denke, es ist viel sauberer, aber wenn die Konventionen von Java mir das nicht sagen, werde ich es nicht tun.

Könnte mir jemand sagen, ob es besser Praxis ist zu initialisieren, oder einfach nur folgern, dass es

Antwort

4

Ein Compiler Unterschied ist

String text; 
text.toString(); 

Ist ein Übersetzungsfehler.

String text = null; 
text.toString(); 

kompiliert, aber ist ein Laufzeitfehler.

Kompilierungsfehler sind besser als Laufzeitfehler. Nicht deklarieren Sie Ihre Variable, bis Sie haben ein Wert für sie ist besser als jede, aber manchmal unmöglich.

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

Ist notwendig. Überlegen Sie in diesem Fall Ihre Variablen final. Dies ist eine gute Vorgehensweise, wenn es möglich ist, aber ich persönlich finde es zu ausführlich und nicht hilfreich, jede lokale Variable zu deklarieren, die sich nicht als endgültig ändert. Dies ist eine Ausnahme, weil int x; mir sagt, dass es sich später ändern wird, ohne mir zu sagen, wie viel es sich ändern wird.

final int x; 
+0

Beachten Sie jedoch, dass Sie das Konstrukt in eine separate Methode extrahieren und dieses eher hässliche Muster vermeiden können. – biziclop

+1

@biziclop können Sie alles in eine separate Methode extrahieren, um jedes Muster zu vermeiden (z. B. doppelt verschachtelte für Schleifen mit einem Break-Break). Ich denke, es ist vernünftig, das nicht aus der Welt zu schaffen, vor allem, wenn Sie es von der Top-Level-Methode aus visuell sehen wollen, wenn Verbindungen ausgecheckt werden. – djechlin

+0

Mir wurde gesagt, dass die Erstellung einer Variablen 'final' dem Compiler/JVM erlaubt, einige Optimierungen vorzunehmen, die er nicht anders machen könnte, wie zum Beispiel Inlining? – Stewart

4

Nach Effective Java null ist es schlechte Praxis ist vor dem ersten Gebrauch lokale Variablen zu deklarieren und zu initialisieren. (Und nach mir auch, aber ich bin nicht sehr eine Autorität.)

Die Idee ist es, ihren Umfang so eng wie möglich zu halten, dies verbessert die Lesbarkeit und stoppt die versehentliche Wiederverwendung.

+0

das macht Sinn. Allerdings weiß ich nicht, ob ich einen Fall hatte, bei dem ich versehentlich ein Feld "wiederverwendete". – sircapsalot

+0

@sircapsalot Es ist in der Regel ein Ergebnis von Cut-and-Pasting, die an sich eine schlechte Praxis ist. – biziclop

1

Das folgende Fragment ist ein Java kompilieren Fehler:

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

Der Fehler in Eclipse ist "Der lokale Variable max wurde möglicherweise nicht initialisiert".

Also müssen Sie Max auf Null initialisieren.

Ich frage mich, was Intellij sagt ...

+1

Das ist meines Wissens keine Eclipse, das ist Java Compiler. (es ist lang genug, seit ich mit javac kompiliert habe kann ich falsch liegen.) – djechlin

+0

Könnte sehr gut sein. Eclipse hat auch einen eigenen Compiler. Ich frage mich, was intelliJ tut? – Arkadiy

+0

Richtig, ich habe versucht, an ein Beispiel zu denken, wann es notwendig sein würde, und das ist eine dieser Zeiten. Von den anderen Antworten scheint es, als wäre der beste Weg, nicht zu initialisieren ... aber diese Dinge könnten schleichen up, und ich mag es, uniform zu sein .. wenn ich es hier machen müsste, würde ich es gerne überall sonst machen – sircapsalot

0

Lokale Methode Variablen standardmäßig nicht initialisiert werden, werden Sie von Klassenfeldern zu denken.Unabhängig davon würde ich die lokale text Variable komplett eliminieren,