ProgrammierungJava Entwickler

Wie funktioniert der final Mechanismus in Java – für Variablen, Methoden und Klassen, und welche unerwarteten Effekte kann eine falsche Verwendung dieses Modifikators hervorrufen?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

final in Java wird verwendet für:

  • Variablen – wird nach der Initialisierung unveränderlich;
  • Methoden – können nicht in Nachfolgern überschrieben werden;
  • Klassen – es können keine Nachfolger erstellt werden.

Merkmale und Feinheiten:

  • final Variable muss bei der Deklaration oder im Konstruktor initialisiert werden;
  • final Referenz erlaubt es nicht, die Referenz zu ändern, aber das Objekt durch die Referenz kann verändert werden (wenn es nicht immutable ist!);
  • Vererbung von einer final Klasse (z. B. String, Math) ist unmöglich;
  • final Methode kann nicht überschrieben werden, selbst wenn die Klasse vererbt ist.
final class A {} // kann nicht class B extends A gemacht werden class Parent { final void foo() { } } class Child extends Parent { // void foo() {} // Fehler: kann foo nicht zurückgeben } final int COUNT = 10;

Fangfrage.

Kann der Zustand eines Objekts, auf das eine final Variable verweist, geändert werden?

Antwort: Ja, wenn es sich nicht um ein immutable-Objekt handelt. Beispiel:

final List<String> names = new ArrayList<>(); names.add("Vasya"); // Dies ist erlaubt – das Objekt über die Referenz wird verändert, nicht die Referenz selbst names = new ArrayList<>(); // Kompilierungsfehler

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


Geschichte

In einem Protokollierungssystem wurde der einzige final Logger im gesamten Code übergeben, in der Annahme, dass das Objekt vollständig geschützt sei – aber die Einstellungen wurden über eine öffentliche Methode geändert, wodurch die Konfiguration global kaputt gemacht wurde.

Geschichte

In einer Dienstprogrammaklasse wurden final Felder vom Typ List erstellt, und dann versuchten sie, diese nach außen zurückzugeben, um sie allgemein zu nutzen. Der Außenbereich konnte den Inhalt der Liste über die erhaltene Referenz problemlos modifizieren – final schützt nicht davor.

Geschichte

Es entstand die Aufgabe, die externe API zu erweitern, die auf final Klassen basierte. Aufgrund dieser war es unmöglich, eine Erweiterung vorzunehmen, und es musste die Logik dupliziert und zwei unabhängige Produktlinien unterstützt werden, was Migrationen erschwerte.