ProgrammierungJava-Entwickler

Erzählen Sie von den wichtigsten Merkmalen der Arbeit mit anonymen und inneren Klassen in Java sowie von den Fallstricken ihrer Verwendung.

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

Antwort.

Innere Klassen sind Klassen, die innerhalb einer anderen Klasse definiert sind. Sie können sein:

  • Statische innere Klassen – statische innere Klassen; haben keinen Zugriff auf nicht-statische Mitglieder der äußeren Klasse ohne eine Instanz.
  • Innere Klassen – nicht-statische innere Klassen; haben Zugriff auf alle Mitglieder der äußeren Klasse.
  • Anonyme Klassen – innere Klassen ohne Namen, die normalerweise an der Stelle der Verwendung deklariert und erstellt werden, häufig bei der Arbeit mit Schnittstellen/abstrakten Klassen.

Beispiel für eine anonyme Klasse:

Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Aktion bei Klick } });

Besonderheiten:

  • Anonyme Klassen können nur auf final (effectively final) Variablen der äußeren Umgebung zugreifen.
  • In jeder Instanz der inneren Klasse wird implizit ein Verweis auf die Instanz der äußeren Klasse gespeichert.
  • Abhängig vom Typ (statisch/intern) können Memory-Leaks oder unerwartete Abhängigkeiten auftreten.

Fangfrage.

Kann eine innere (nicht-statische) Klasse statische Methoden oder Variablen enthalten?

Antwort: Nein, kann sie nicht, außer Konstanten (static final). Nur die statische innere Klasse kann statische Mitglieder haben.

Beispiel (Fehler):

class Outer { class Inner { static int x = 10; // Kompilierungsfehler! } }

Richtig wäre es so:

class Outer { static class StaticNested { static int x = 10; // OK } }

Beispiele für reale Fehler aufgrund von Unkenntnis der Feinheiten des Themas.


Geschichte

In einer Android-Anwendung wurde eine innere Klasse als Event-Handler verwendet. Der Handler wurde in einem statischen Feld gespeichert und hielt eine implizite Referenz auf die Activity, was zu einem Speicherleck führte, als diese zerstört wurde, und die Anwendung begann zu "lecken", bis hin zu OutOfMemoryError.


Geschichte

In einem der Mikroservices wurden anonyme Klassen verwendet, die auf externe Iterator-Variablen verwiesen. Nach einer Umstrukturierung hörten die Variablen auf, effectively final zu sein, und der Code konnte nicht mehr kompiliert werden – die Entwickler suchten lange nach der Ursache, bis sie sich an diese Einschränkung erinnerten.


Geschichte

In einer Bibliothek wurden statische Variablen innerhalb einer inneren Klasse verwendet, in der Annahme, dass dies gängige Praxis sei. In neuen Versionen des JDK hörte das Projekt aufgrund strengerer Standards auf zu kompilieren. Es war eine dringende Überarbeitung der Architektur erforderlich.