Welchen Unterschied final
macht das zwischen dem Code unten. Gibt es einen Vorteil zu erklären , die Argumente als final
.
public String changeTimezone( Timestamp stamp, Timezone fTz, Timezone toTz){
return ....
}
public String changeTimezone(final Timestamp stamp, final Timezone fTz,
final Timezone toTz){
return ....
}
Antworten:
Da ein formaler Methodenparameter eine lokale Variable ist, können Sie von inneren anonymen Klassen nur dann auf sie zugreifen, wenn sie als endgültig deklariert sind.
Dies erspart Ihnen die Deklaration einer weiteren lokalen Endvariablen im Methodenkörper:
quelle
Auszug aus Das letzte Wort des letzten Schlüsselworts
quelle
Das Finale verhindert, dass Sie der Variablen einen neuen Wert zuweisen. Dies kann beim Abfangen von Tippfehlern hilfreich sein. Stilistisch möchten Sie möglicherweise die empfangenen Parameter unverändert lassen und nur lokalen Variablen zuweisen, sodass final dazu beitragen würde, diesen Stil durchzusetzen.
Ich muss zugeben, dass ich selten daran denke, final für Parameter zu verwenden, vielleicht sollte ich es tun.
quelle
Es macht keinen großen Unterschied. Es bedeutet nur, dass Sie nicht schreiben können:
aber du kannst trotzdem schreiben:
Dies ist hauptsächlich ein Hinweis für den Wartungsprogrammierer, der Ihnen folgt, dass Sie dem Parameter irgendwo in der Mitte Ihrer Methode keinen neuen Wert zuweisen werden, wenn dies nicht offensichtlich ist und daher Verwirrung stiften kann.
quelle
Das letzte Schlüsselwort bei Verwendung für Parameter / Variablen in Java markiert die Referenz als endgültig. Wenn ein Objekt an eine andere Methode übergeben wird, erstellt das System eine Kopie der Referenzvariablen und übergibt sie an die Methode. Indem Sie die neuen Referenzen als endgültig markieren, schützen Sie sie vor einer Neuzuweisung. Es wird manchmal als eine gute Codierungspraxis angesehen.
quelle
Für den Hauptteil dieser Methode verhindert das
final
Schlüsselwort, dass die Argumentreferenzen versehentlich neu zugewiesen werden, was in diesen Fällen zu einem Kompilierungsfehler führt (die meisten IDEs beschweren sich sofort). Einige mögen argumentieren, dass die Verwendungfinal
im Allgemeinen, wann immer dies möglich ist, die Dinge beschleunigen wird, aber dies ist in neueren JVMs nicht der Fall.quelle
Zwei Vorteile, die ich sehe, sind aufgeführt:
1 Durch Markieren des Methodenarguments als endgültig wird eine Neuzuweisung des Arguments innerhalb der Methode verhindert
Von Ihrem Beispiel
Bei einer komplizierten Methode hilft das Markieren der Argumente als endgültig bei der versehentlichen Interpretation dieser Argumente als Methoden. Lokale Variablen und die Neuzuweisung als Compiler kennzeichnen diese Fälle wie im Beispiel gezeigt.
2 Übergabe des Arguments an eine anonyme innere Klasse
Da ein formaler Methodenparameter eine lokale Variable ist, können Sie von inneren anonymen Klassen nur dann auf sie zugreifen, wenn sie als endgültig deklariert sind.
quelle
- In der Vergangenheit (vor Java 8 :-))
Die Verwendung des Schlüsselworts "final" beeinflusste die Zugänglichkeit der Methodenvariablen für interne anonyme Klassen.
- In der modernen Sprache (Java 8+) ist eine solche Verwendung nicht erforderlich:
Java führte "effektiv endgültige" Variablen ein. Lokale Variablen und Methodenparameter werden als endgültig angenommen, wenn der Code keine Änderung des Werts der Variablen impliziert. Wenn Sie ein solches Schlüsselwort in Java8 + sehen, können Sie davon ausgehen, dass es nicht erforderlich ist. Durch die Einführung von "effektiv endgültig" geben wir weniger Code ein, wenn wir Lambdas verwenden.
quelle
Es ist nur ein Konstrukt in Java, mit dem Sie einen Vertrag definieren und sich daran halten können. Eine ähnliche Diskussion hier: http://c2.com/cgi/wiki?JavaFinalConsideredEvil
Übrigens - (wie das Twiki sagt), das Markieren von Argumenten als endgültig ist im Allgemeinen überflüssig, wenn Sie guten Programmierprinzipien folgen und die Referenz für eingehende Argumente neu zuweisen / neu definieren.
Wenn Sie die args-Referenz im schlimmsten Fall neu definieren, hat dies keine Auswirkungen auf den tatsächlichen Wert, der an die Funktion übergeben wird, da nur eine Referenz übergeben wurde.
quelle
Ich spreche davon, Variablen und Felder im Allgemeinen als endgültig zu markieren - gilt nicht nur für Methodenargumente. (Das Markieren von Methoden / Klassen endgültig ist eine ganz andere Sache).
Dies ist ein Gefallen für die Leser / zukünftigen Betreuer Ihres Codes. Zusammen mit einem vernünftigen Namen der Variablen ist es für den Leser Ihres Codes hilfreich und beruhigend zu sehen / verstehen, was die fraglichen Variablen darstellen - und es ist für den Leser beruhigend, dass die Bedeutung erhalten bleibt, wenn Sie die Variable im selben Bereich sehen das gleiche, so muss er sich nicht am Kopf kratzen, um immer herauszufinden, was eine Variable in jedem Kontext bedeutet. Wir haben zu viele Missbräuche bei der "Wiederverwendung" von Variablen gesehen, was selbst ein kurzes Code-Snippet schwer verständlich macht.
quelle
Das letzte Schlüsselwort verhindert, dass Sie dem Parameter einen neuen Wert zuweisen. Ich möchte dies anhand eines einfachen Beispiels erklären
Angenommen, wir haben eine Methode
In dem obigen Fall würde, wenn dem "dateOfBirth" in Methode2 ein neuer Wert zugewiesen wird, dies zu einer falschen Ausgabe von Methode3 führen. Da der Wert, der an Methode3 übergeben wird, nicht der Wert ist, der vor der Übergabe an Methode2 war. Um dieses endgültige Schlüsselwort zu vermeiden, wird es für Parameter verwendet.
Dies ist auch eine der Best Practices für die Java-Codierung.
quelle