ProgrammatieJava ontwikkelaar

Vertel over de belangrijkste kenmerken van het werken met anonieme en geneste klassen in Java, evenals de valkuilen bij hun gebruik.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Geneste klassen zijn klassen die binnen een andere klasse zijn gedefinieerd. Ze zijn er in:

  • Static nested classes — statische geneste klassen; hebben geen toegang tot niet-statische leden van de buitenste klasse zonder een instantie.
  • Inner classes — niet-statische geneste klassen; hebben toegang tot alle leden van de buitenste klasse.
  • Anonieme klassen — interne klassen zonder naam, die gewoonlijk ter plaatse worden gedeclareerd en gemaakt, vaak bij het werken met interfaces/abstracte klassen.

Voorbeeld van een anonieme klasse:

Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // actie bij klikken } });

Kenmerken:

  • Anonieme klassen kunnen alleen verwijzen naar final (effectief final) variabelen van de externe scope.
  • In elke instantie van de interne klasse wordt impliciet een verwijzing naar de instantie van de buitenste klasse opgeslagen.
  • Afhankelijk van het type (static/inner) kunnen er geheugenlekken of onverwachte afhankelijkheden optreden.

Vraag met een valstrik.

Kan een interne (non-static inner) klasse statische methoden of variabelen bevatten?

Antwoord: Nee, dat kan niet, behalve constants (static final). Alleen een static nested class (statische geneste klasse) kan statische leden hebben.

Voorbeeld (fout):

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

Correct zou zijn:

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

Voorbeelden van reële fouten door het niet kennen van de nuances van het onderwerp.


Verhaal

In een Android-applicatie werd een inner class gebruikt als gebeurtenis-handler. De handler werd opgeslagen in een static-veld en hield een impliciete verwijzing naar de Activity, waardoor er bij vernietiging van de Activity een geheugenlek optrad, en de applicatie begon "te lekken", tot aan OutOfMemoryError.


Verhaal

In een van de microservices werden anonieme klassen gebruikt die verwezen naar externe iterator-variabelen. Na refactoring waren de variabelen niet meer effectief final, en de code compileerde niet meer — ontwikkelaars zochten lang naar de oorzaak, totdat ze zich dit beperkte wisten te herinneren.


Verhaal

In de bibliotheek werden statische variabelen inside een inner class gebruikt, in de veronderstelling dat dit gebruikelijk was. In nieuwe versies van JDK stopte het project met compileren, omdat de standaard strenger werd met de beperkingen. Een dringende herstructurering van de architectuur was nodig.