© Excellent backgrounds/Shutterstock.com
Java Magazin
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?

Sven Ruppert, Heinz Kabutz


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 1public T[] toArray() { return toArray( (T[]) Array.newInstance(valueType, size()));}

Listing 2public class BetterArrayList extends ArrayList {  private final Class valueType;  public BetterArrayList(int initialCapacity, Class valueType) { super(initialCapacity); this.valueType = valueType; }  public BetterArrayList(Class valueType) { this.valueType = valueType; }  public BetterArrayList(Collection extends T> ts, Class 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 names = new BetterArrayList(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 Interface BetterCollection und eine Klasse BetterCollectionObjectAdapter zu schreiben. Bei einem ObjectAdapter handelt es sich um eine Hüllklasse, die die Methodenaufrufe durchdelegiert. Dieses Pattern gehört zu der Klasse der Strukturmuster. Ziel dieses Patterns ist die Umsetzung von der Schnittstelle A auf ...

Java Magazin
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?

Sven Ruppert, Heinz Kabutz


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 1public T[] toArray() { return toArray( (T[]) Array.newInstance(valueType, size()));}

Listing 2public class BetterArrayList extends ArrayList {  private final Class valueType;  public BetterArrayList(int initialCapacity, Class valueType) { super(initialCapacity); this.valueType = valueType; }  public BetterArrayList(Class valueType) { this.valueType = valueType; }  public BetterArrayList(Collection extends T> ts, Class 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 names = new BetterArrayList(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 Interface BetterCollection und eine Klasse BetterCollectionObjectAdapter zu schreiben. Bei einem ObjectAdapter handelt es sich um eine Hüllklasse, die die Methodenaufrufe durchdelegiert. Dieses Pattern gehört zu der Klasse der Strukturmuster. Ziel dieses Patterns ist die Umsetzung von der Schnittstelle A auf ...

Neugierig geworden?


    
Loading...

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