Da ich glaube, dass dies eine gute Programmierpraxis ist, mache ich alle meine (lokalen oder Instanz-) Variablen, final
wenn sie nur einmal geschrieben werden sollen.
Ich stelle jedoch fest, dass Sie eine Variable nicht endgültig machen können, wenn eine Variablenzuweisung eine Ausnahme auslösen kann:
final int x;
try {
x = Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
x = 42; // Compiler error: The final local variable x may already have been assigned
}
Gibt es eine Möglichkeit, dies zu tun, ohne auf eine temporäre Variable zurückzugreifen? (oder ist dies nicht der richtige Ort für einen endgültigen Modifikator?)
final int x = makeX();
bestimmt. (Try-Catch-In-Funktion)tryParse
.Antworten:
Eine Möglichkeit, dies zu tun, besteht darin, eine (nicht
final
) temporäre Variable einzuführen , aber Sie sagten, dass Sie das nicht wollten.Eine andere Möglichkeit besteht darin, beide Zweige des Codes in eine Funktion zu verschieben:
final int x = getValue(); private int getValue() { try { return Integer.parseInt("someinput"); } catch(NumberFormatException e) { return 42; } }
Ob dies praktikabel ist oder nicht, hängt vom genauen Anwendungsfall ab.
Alles in allem
x
könnte der praktischste allgemeine Ansatz darin bestehen, sie nicht zu belassen , solange es sich um eine lokale Variable mit angemessenem Umfang handeltfinal
.Wenn es sich andererseits
x
um eine Mitgliedsvariable handelt, würde ich empfehlen,final
während der Initialisierung eine nicht temporäre Variable zu verwenden :public class C { private final int x; public C() { int x_val; try { x_val = Integer.parseInt("someinput"); } catch(NumberFormatException e) { x_val = 42; } this.x = x_val; } }
quelle
this.x
ein Primitiv istboolean
, ebenso wie die lokale Variable. Selbst mit Java 9 erhalten wir "<thing_in_the_role_of_x_val
> wurde möglicherweise nicht initialisiert". Das Fehlen einer Kontrollflussanalyse für diese Situation ist frustrierend, kann aber leicht umgangen werden.Nein, es ist nicht der richtige Ort. Stellen Sie sich vor, Sie haben mehr als 1 Anweisung in Ihrem Try-and-Catch-Block. Die erste lautet: x = 42. Nach einigen anderen Anweisungen schlägt der Try-Block fehl und geht zum Catch-Block, in dem Ihre Sprich x = 30. Jetzt hast du x zweimal definiert.
quelle