Java - Warum sollte man final auf variablen anwenden?

5 Antworten

Das Java-Schlüsselwort final hat ein paar verschiedene Bedeutungen, in diesem Zusammenhang bedeutet es, dass der Referenz kein neuer Wert mehr zugewiesen werden kann.

  • Es hilft dabei, Fehler zu vermeiden. Wenn eine Variable schon von der Programmlogik her nicht veränderlich sein soll, kann ich so garantieren, dass es auch nicht versehentlich passiert.
  • "Immutability" ist einer der effektivsten Ansätze, um Nebenläufigkeit ("Multithreading") sicher zu machen: http://tutorials.jenkov.com/java-concurrency/thread-safety-and-immutability.html
  • Es kann der JVM bzw. dem JIT-Compiler ein wenig bei der Optimierung helfen. In der Praxis ist der aber meistens sowieso schlau genug, eine de-facto unveränderte Variable zu bemerken, und der Nutzen ist gering. Viel wichtiger ist es, jeweils den richtigen Scope bzw. die richtige Sichtbarkeit (im Zweifel immer private) zu verwenden. Nur aus diesem Grund sollte man also nicht überall "final" verstreuen.
dass der Referenz kein neuer Wert mehr zugewiesen werden kann.

Ah, das war missverständlich. Genauer gesagt, der Variable kein neuer Wert (in dem Fall keine neue Referenz) mehr zugewiesen werden kann.

1

Sagen wir du benutzt Final bei einer Variable x mit dem Wert 5, dann kannst du durch eine z.B. Schleife im späteren Verlauf des Programms den Wert nicht ändern. Der Wert wird immer 5 bleiben egal was du machst.

final = kann nicht mehr im späteren code abgeändert werden

Benutzt man oft bei APIs, damit die Leute, die diese nutzen, nicht einfach irgendwelche Sachen ändern.

Das dient u. a. der Laufzeitoptimierung durch den JIT-Compiler. Damit lassen sich unnötige Dereferenzierungen vermeiden.

Woher ich das weiß:Berufserfahrung

wird doch von java automatisch optimiert, oder?

0
@colum123

Ja. In der Praxis ist das das schwächste Argument, warum man irgendwas "final" machen sollte. Tatsächlich weiß der JIT-Compiler zB bei lokalen Variablen gar nicht, ob sie im Sourcecode final waren: das steht nämlich gar nicht im Bytecode. Schon in der JLS gibt es daher den Begriff "effectively final" - "de-facto final".

1