Sven Ruppert Reply

„Wir haben die Möglichkeit, typsichere DynamicObjectAdapter generieren zu lassen, inklusive der dazu benötigten Komfortklassen.“

In den letzten Teilen dieser Artikelserie hatten wir uns mit dem DynamicObjectAdapter beschäftigt. Wir haben ihn mit einigen Modifikationen und Ergänzungen so aufbereitet, dass wir mittels einem Builder nur noch gültige Adapter verwenden konnten und die Anwendung sehr viel einfacher war. Leider war in der letzten Lösung doch recht viel manuelle Tätigkeit notwendig. Das wird sich nun ändern.

Wir haben uns das letzte Mal mit dem DynamicObjectAdapter auseinandergesetzt, der es uns ermöglicht, einzelne Methoden zu adaptieren, ohne den Adapter in der Vererbung haben zu müssen. Um das sicherer zu gestalten, haben wir für die jeweiligen Methoden Functional Interfaces erzeugt und sie als Parameter in einem Builder in den jeweiligen with-Methoden verwendet. Damit haben wir sowohl den Builder als auch den DynamicObjectAdapter in Kombination gebracht und für die Verwendung eine robuste und einfache Handhabung ermöglicht. Aber es ist nicht automatisch gewährleistet, dass Modifikationen direkt bei einem Übersetzungsprozess erkannt werden können. Jedoch sind alle Informationen vorhanden, um diesem Problem zu begegnen und dabei auch noch viel manuelle Arbeit zu sparen.

Das Vorgehen ist immer dasselbe und sehr geradlinig. Von dem Zielinterface werden alle Methodensignaturen genommen und dazu jeweils Functional Interfaces erzeugt. Gehen wir in unserem Beispiel von einem Interface mit dem Namen Service aus:

 public interface Service {

String doWork_A(String txt);
String doWork_B(String txt);
}

In diesem Interface sind nun zwei Methoden definiert. Gehen wir nun davon aus, dass wir zu diesem Interface zwei weitere Interfaces definieren. Diese enthalten jeweils eine der Methodendefinitionen:

 

public interface ServiceDoWork_A {
String doWork_A(String txt);
}

public interface ServiceDoWork_B {
String doWork_B(String txt);
}

Um eindeutige Namen für die Interfaces zu bekommen, sollte man sich ein Namensschema überlegen. Hier habe ich einfach den Namen des Originalinterface um den Methodennamen erweitert.
Bisher haben wir diese Functional Interfaces manuell erzeugt. Doch bei der Betrachtung des Quelltexts fällt einem recht schnell auf, dass es sich um Muster handelt, die sich bestens eigenen, um mit einem Generator erzeugt zu werden. Die Antwort liegt in der Verwendung des Annotation-Processor-Plug-ins. Dieses existiert immerhin seit der Java-Version 5.
Um nun ein Interface derart zu markieren, dass es als Basis für einen DynamicObjectAdapter verwendet werden soll, erzeugen wir die Annotation @DynamicObjectAdapterBuilder. Mithilfe dieser Annotation werden wir bei der Übersetzung der Quelltexte die Möglichkeit haben, mit einem speziellen AnnotationProcessor auf genau diese Markierung zu reagieren und mit dem Generieren zu beginnen:

 
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface DynamicObjectAdapterBuilder { }

Den vollständigen Artikel lesen Sie in der Ausgabe:

Java Magazin 11.16 - "Automatisiertes Testen"

Alle Infos zum Heft
285704DynamicObjectAdapter schnell und typsicher erzeugen
X
- Gib Deinen Standort ein -
- or -