© Excellent backgrounds/Shutterstock.com
Adapter Pattern in Java mit Reflection

Adapter Design Pattern


Prinzipiell gibt es zwei verschiedene Typen von Adapter Design Patterns: Object Adapter Patterns und Class Adapter Patterns. Der Vorteil des Object Adapter Pattern ist, dass es auf ganze Hierarchien von Objekten angewendet werden kann. Der Vorteil des Class Adapter Pattern hingegen ist, dass nicht alle Methoden überschrieben werden müssen. Wie sieht das nun an einem Beispiel aus?

Nehmen wir ein Beispiel, das wohl jeder Entwickler kennt: Collection.toArray() gibt einem Entwickler ein Object-Array als Ergebnis zurück. Das ist ein eher unbefriedigendes Ergebnis. Seit JDK 5 jedoch gibt es ein Feature, das nicht ganz so bekannt ist. Der Rückgabewert einer Methode kann bei überschriebenen Methoden verändert werden. Sehen wir uns nun den Fall für eine Collection mit Strings an. Um dieses in ein Array umzuwandeln, muss als Argument ein String-Array selbst übergeben werden. Das ist nicht sehr elegant. Wie kann man sich diesen Schritt sparen?

Beginnen wir mit einer Klasse, geben ihr den Namen BetterArrayList und erben von der Klasse ArrayList. Der wichtige Teil ist die Methode toArray().

Listing 1

public T[] toArray() { return toArray( (T[]) Array.newInstance(valueType, size())); }

Listing 2

public class BetterArrayList<T> extends ArrayList<T> { private final Class<T> valueType; public BetterArrayList(int initialCapacity, Class<T> valueType) { super(initialCapacity); this.valueType = valueType; } public BetterArrayList(Class<T> valueType) { this.valueType = valueType; } public BetterArrayList(Collection<? extends T> ts, Class<T> valueType) { super(ts); this.valueType = valueType; }  // You can modify the return type of   // an overridden method in  // Java 5, with some restrictions. public T[] toArray() { return toArray( (T[]) Array.newInstance(valueType, size())); } public static void main(String[] args) { BetterArrayList<String> names = new BetterArrayList<String>(String.class); names.add("Wolfgang"); names.add("Leander"); names.add("Klaus"); names.add("Reinhard"); String[] nameArray = names.toArray(); for (String s : nameArray) { System.out.println(s); } } }

Bei der Verwendung der Klasse BetterArrayList sieht man den Vorteil. Es ist nicht mehr notwendig, die typische und weniger elegante Version und Syntax des JDK zu verwenden. Jedoch muss bei jeder Instanziierung der Typ mit angegeben werden, und diese Implementierung arbeitet immer mit einer ArrayList. In vielen Fällen mag das ausreichen, jedoch nicht in allen.

Der nächste Schritt besteht nun darin, ein In...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang