1.4-Software-Development-Principles

Inner and Anonymous classes

Inleiding

Anonieme klassen (Anonymous classes) zijn natuurlijk geintroduceerd in de theorie van Lambda Expressions. Er is echter een detail dat we niet besproken hebben.

Anonieme klasses worden altijd gedefineerd binnen een andere klasse, dat heet een inner class. Dit geeft ze speciale privileges.

Inner classes hebben toegang tot private fields!

Inner class access example

We laten de mogelijkheden zien met deze Runnable inner klasseā€

public class OuterClass {
    private int price = 15;
    
    public Runnable getPricePrinter() {
        return new InnerClass();
    }
    
    public class InnerClass implements Runnable {
        @Override
        public void run() {
            System.out.println(price);
        }
    }
}

Door getPricePrinter() aan te roepen ontvang je een simpele implementatie, maar dit is natuurlijk maar het begin.

Het voorbeeld had even makkelijk gewerkt met een anonieme klasse.

Een inner klasse geeft je vooral een mogenlijkheid om een nieuwe subgroep van methoden en data op te slaan. Wanneer deze opdeling helpt in het begrijpen van de code is dat reden genoeg.

Tevens heb je een nieuw ontworpen implementatie die de prive data op een andere manier kan verwerken.

Het grote nadeel blijft dat je blijkbaar zoveel methoden had dat het nodig werd om dingen op te delen vanuit een klasse die misschien wat groot is.

Handige interfaces

Java biedt een heleboel handige interfaces met verschillende doelen. Om altijd maar een externe bronnen te voorzien van de juiste implemenatie is een inner klasse of een anonieme klasse het beste de verantwoordelijkheid zijn van de klasse zelf.

Het ontwerpen van een instantie met een specieke verantwoordelijkheid voor een variatie van de standaard operaties op jouw interne data staat je toe om dat te groeperen binnen de verantwoordelijkheid van een inner (of anonieme) klasse.

Conclusie

Inner klasses helpen je met het groeperen van methoden en verantwoordelijkheden. Daarnaast helpen de standaard interfaces van Java je met het kiezen van functionaliteit die je via een inner klasse kunt aanbieden.