Hat das Keyword final irgendwelche Auswirkungen auf die JVM? [Duplikat]

8

Ich habe kürzlich eine Empfehlung erhalten, das Keyword final so weit wie möglich zu verwenden. Das ist gut, um zu verhindern, dass ein Programmierer sein eigenes Bein erschießt - das heißt, die Variable neu zuweisen, die nicht neu zugewiesen werden sollte.

Aber, dient es einem anderen Ziel? Das heißt, kann JVM Informationen über die endgültigen Variablen verwenden, um den Bytecode irgendwie zu optimieren, damit er schneller lief (ein besseres Pipelining erstellen oder ihn in einer Multithread-Umgebung verwenden)? Oder ist nur ein syntaktischer Zucker, der die Möglichkeit von Fehlern während der Codeentwicklung minimiert?

    
SPIRiT_1984 28.05.2015, 12:16
quelle

4 Antworten

4

IBM gibt an:

  

Wie viele Mythen über Java-Leistung wird die falsche Annahme, Klassen oder Methoden als Endergebnisse für eine bessere Leistung zu deklarieren, weit verbreitet, aber selten untersucht. Das Argument besagt, dass das Deklarieren einer Methode oder Klasse als endgültig bedeutet, dass der Compiler in der Lage ist, Methodenaufrufe aggressiver auszuführen, da er weiß, dass dies zur Laufzeit definitiv die Version der Methode ist, die aufgerufen wird. Aber das ist einfach nicht wahr. Nur weil die Klasse X gegen die letzte Klasse Y kompiliert wird, heißt das nicht, dass zur Laufzeit die gleiche Version der Klasse Y geladen wird. Daher kann der Compiler solche Cross-Class-Methodenaufrufe nicht sicher, endgültig oder nicht inline einreihen. Nur wenn eine Methode privat ist, kann der Compiler sie frei einbinden, und in diesem Fall wäre das endgültige Schlüsselwort redundant.

    
MKorsch 28.05.2015, 12:27
quelle
4

Was die Variablen betrifft, ist Java schlau genug, um herauszufinden, dass eine Variable nirgendwo in der Methode geändert wird, und dieses Wissen zu Optimierungszwecken verwendet. Sie müssen nicht eine Variable final markieren, um das zu wissen.

Methoden sind etwas anders: Wenn Sie eine Methode final markieren, kann Java diese Methode schneller aufrufen, da sie nicht mehr nach den Überschreibungen suchen muss. Dennoch ist Hotspot schlau genug, um herauszufinden, dass es keine Overrides gibt, mit oder ohne die Verwendung von final .

Im Allgemeinen soll diese Empfehlung jedoch Ihren Code für andere leichter lesbar und verständlich machen: Wenn Sie ein variables Finale machen, erfahren Sie, dass Sie eine Konstante erstellen. Ein Klassenabschluss macht Ihren Lesern klar, dass die Klasse nicht für die Vererbung ausgelegt ist; Wenn Sie eine Methode final machen, wird Ihren Lesern mitgeteilt, dass die Logik dieser Methode in der Vererbungshierarchie invariant bleiben soll. Auf lange Sicht sind diese Informationen wertvoller als die Möglichkeit, Ihren laufenden Code zu optimieren.

    
dasblinkenlight 28.05.2015 12:24
quelle
1

final-Methoden können von der JVM bis zu dem Zeitpunkt, an dem sie von der JVM geladen werden, inline eingefügt werden. Wenn Sie also sicher sind, dass die Methode nicht neu definiert wird, markieren Sie sie als endgültig.

Konstanten sollten immer statisch final sein, da sie unveränderlich sind und jvm diese Variablen nicht verfolgen muss, da sie sich niemals ändern werden.

    
Farhad 28.05.2015 12:25
quelle
1

Ich denke, diese Empfehlung ist ein bisschen zu unspezifisch.

Zum Beispiel; Ich würde empfehlen, die Verwendung von final für Klassen und Methoden standardmäßig zu vermeiden (weil die letzten Klassen Komponententests unterbrechen).

Ich finde auch, dass die Verwendung von final für Methodenparameter nur eine Verschwendung von "Bildschirmplatz" ist (und dadurch: "Energie" auf der Seite des Lesers verschwendet).

Auf der anderen Seite können Objekte von solchen Klassen in unveränderliche Dinge verwandeln, wenn sie nur endgültige Attribute für Klassen haben; und das ist eine gute Sache.

Wie Sie sehen; Es gibt viele Vor- und Nachteile bei der Verwendung von final; und ich denke, dass "Lesbarkeit" meistens "potenzielle" Leistungsverbesserungen übertrifft.

    
GhostCat 28.05.2015 12:27
quelle