Geneste klassen zijn klassen die binnen een andere klasse zijn gedefinieerd. Ze zijn er in:
Voorbeeld van een anonieme klasse:
Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // actie bij klikken } });
Kenmerken:
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 } }
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.