Gibt es einen Leistungsgrund, um Methodenparameter in Java als endgültig zu deklarieren?
Wie in:
public void foo(int bar) { ... }
Gegen:
public void foo(final int bar) { ... }
Angenommen, das bar
wird nur gelesen und nie geändert foo()
.
Gibt es einen Leistungsgrund, um Methodenparameter in Java als endgültig zu deklarieren?
Wie in:
public void foo(int bar) { ... }
Gegen:
public void foo(final int bar) { ... }
Angenommen, das bar
wird nur gelesen und nie geändert foo()
.
Antworten:
Das endgültige Schlüsselwort wird in der Klassendatei für lokale Variablen und Parameter nicht angezeigt und kann daher die Laufzeitleistung nicht beeinflussen. Es dient nur dazu, die Absicht des Codierers zu klären, dass die Variable nicht geändert wird (was viele als zweifelhaften Grund für ihre Verwendung betrachten) und sich mit anonymen inneren Klassen zu befassen.
Es gibt viele Argumente darüber, ob der endgültige Modifikator für die Methode selbst einen Leistungsgewinn aufweist, da die Methoden ohnehin zur Laufzeit vom optimierenden Compiler eingefügt werden, unabhängig vom Modifikator. In diesem Fall sollte es auch nur verwendet werden, um das Überschreiben der Methode einzuschränken.
Der einzige Vorteil eines endgültigen Parameters besteht darin, dass er in anonymen verschachtelten Klassen verwendet werden kann. Wenn ein Parameter nie geändert wird, erkennt der Compiler dies bereits als Teil seines normalen Betriebs, auch ohne den endgültigen Modifikator. Es ist ziemlich selten, dass Fehler dadurch verursacht werden, dass ein Parameter unerwartet zugewiesen wird. Wenn Ihre Methoden groß genug sind, um diese technische Ebene zu benötigen, verkleinern Sie sie. Die von Ihnen aufgerufenen Methoden können Ihre Parameter nicht ändern.
Compiler, die nach dem Laden der Klasse ausgeführt werden, wie z. B. JIT-Compiler, können die endgültigen Methoden nutzen. Folglich könnten als endgültig deklarierte Methoden einen gewissen Leistungsvorteil haben.
http://www.javaperformancetuning.com/tips/final.shtml
Oh und noch eine gute Ressource
Nur noch ein Punkt, der über die Verwendung nicht endgültiger lokaler Variablen hinausgeht, die innerhalb der Methode deklariert wurden - die Instanz der inneren Klasse kann den Stapelrahmen überleben, sodass die lokale Variable möglicherweise verschwindet, während das innere Objekt noch lebt
Ich gehe davon aus, dass der Compiler möglicherweise alle privaten statischen endgültigen Variablen mit einem primitiven Typ wie int entfernen und wie bei einem C ++ - Makro direkt in den Code einfügen könnte.
Ich habe jedoch keine Ahnung, ob dies in der Praxis gemacht wird, aber es könnte gemacht werden, um etwas Speicherplatz zu sparen.