Was sind Adapterklassen?

Adapter-Klassen sind Klassen, die die Verwendung von Interfaces vereinfachen, indem sie erlauben, nur auf die gerade benötigten Methoden des Interface zuzugreifen.

Implementiert eine Klasse ein Interface, so müssen dort alle Methoden des Interface konkretisiert werden. Java kennt eine ganze Reihe an Interfaces, die 3, 4, 5 oder sogar 7 Methoden deklarieren. Wird eines von ihnen implementiert, kann dies zu recht unübersichtlichem Code in der implementierenden Klasse führen, wenn nicht alle Methoden tatsächlich verwendet werden. Sie erscheinen dann als leere Deklarationen. Adapterklassen vermeiden dies, indem sie erlauben, nur die tatsächlich benötigten Methoden zu überschreiben.

Das Beispiel erläutert den Mechanismus anhand der Deklaration eines Beispiel-Interfaces und einer dazugehörigen Adapterklasse.

/* File MacherInterface.java */
public interface MacherInterface {
    public void machEtwas();
    public void machWasAnderes();
}

/* File MacherInterfaceImpl.java */
public class MacherInterfaceImpl implements MacherInterface {

    @Override
    public void machEtwas() {
        System.out.println("Mach was mit dem Interface");
        
    }
    
    @Override
    public void machWasAnderes() {
        System.out.println("Mach was anderes mit dem Interface");
    }
    
    public static void main(String[] args) {
        MacherInterfaceImpl mi = new MacherInterfaceImpl();
        mi.machEtwas();
        mi.machWasAnderes();
    }
}

Das Interface MacherInterface deklariert zwei einfache Methoden. Die Klasse MacherInterfaceImpl implementiert das Interface, sodass beide Methoden überschrieben werden müssen. Dies ist auch der Fall, wenn nur eine der beiden Methoden benötigt wird.

public abstract class MacherAdapter implements MacherInterface {

    @Override
    public void machEtwas() {}

    @Override
    public void machWasAnderes() {}
}

Verwendet man einen Adapter, so kann dieser statt der Implementierung des Interfaces verwendet werden.
Die Klasse MacherAdapter implementiert das Interface ebenfalls, ist jedoch abstract deklariert. Die Körper der überschriebenen Methoden sind leer, sodass diese überschrieben werden können.

public class AdapterBeispiel {

    public static void main(String[] args) {
        new MacherAdapter() {
            public void machEtwas() {
                System.out.println("Mach was mit dem Adapter");
            }
        }.machEtwas();
    }
}

Siehe auch den Artikel zum Adapter-Design-Pattern zum gleichnamigen Thema.