© Excellent backgrounds/Shutterstock.com
Java Magazin
Warum das C in CDI den Unterschied macht

Kontext ist alles

Immer mehr Dependency-Injection-(DI-)Frameworks erblicken das Licht der Welt, darunter auch „Dagger“ und „Boon“, die auf den folgenden Seiten vorgestellt werden. Darunter sind allerdings nur wenige CDI-Frameworks, was bedauerlich ist - schließlich ist das C (für „Contexts“) doch das eigentlich Interessante an CDI. Der folgende Beitrag zeigt, warum das C den Unterschied macht und wie man es einsetzen kann - übrigens nicht nur auf der Java-EE-Seite.

Sven Ruppert


Im Folgenden werden wir uns verschiedene Einsatzmöglichkeiten von CDI ansehen, an denen gezeigt wird, wofür das „C“ steht und weshalb es so nützlich ist. Dabei werde ich ausschließlich das Core-JDK und die CDI-Spezifikation verwenden. Als Basisimplementierung kommt der Weld-Container zum Einsatz.

Doch zunächst zu den Zielen von CDI: Hier gibt es sicher verschiedene Interpretationen. Wir gehen im Folgenden davon aus, dass wir eine Methode haben und nennen diese execute(). Als Rückgabewert kommt eine Liste zum Einsatz:

public List execute(){ ... };

Und hier fängt es schon an: Es handelt sich um ein Interface. Wir wissen also nicht, ob sich dahinter eine ArrayList oder eine LinkedList verbirgt. Es kann natürlich eine beliebige Implementierung sein. Und damit machen wir auch alles richtig, solange wir keine speziellen Methoden einer Implementierung auf diesem Rückgabewert anwenden wollen. Als Beispiel sei hier die Methode trimToSize() von der Implementierung ArrayList genannt. Aber ist damit eine Entkopplung erreicht? Ich sage einfach mal: nein. Doch wo beginnt eine Kopplung und wo endet sie? Sehen wir uns dazu erst einmal das Innenleben der Methode execute() an:

import java.util.List;import java.util.ArrayList; public List execute(){ final List result = new ArrayList(); //.... return result;}

Im Inneren haben wir uns für die Implementierung der ArrayList entschieden. Damit ist an dieser Stelle alles fest verdrahtet. Aber ergibt diese Entscheidung Sinn? Wir wissen es nur, wenn wir genug über die Eigenschaften der Anwendung wissen. Eigentlich wäre es nützlicher, zur Laufzeit zu entscheiden, welche Implementierung der Umgebung am besten entspricht. Aber nicht nur da haben wir uns in der statischen Semantik festgesetzt. Der Import ist natürlich genauso eine Kopplung. Aber dazu gleich mehr.

Wollen wir nun die Erzeugung der ArrayList auslagern, kann man zum Beispiel zu dem Pattern Factory greifen. Und damit man die Auswahl hat, welche Implementierung es werden soll, bietet uns die Factory gleich mehrere Methoden an. Selbstverständlich kann es auch durch Parameter gesteuert werden. Das macht aber für die Überlegung keinen Unterschied.

Listing 1import java.util.ArrayList;import java.util.LinkedList;import java.util.List; public class ListFactory { public List createArrayList() { return new ArrayList(); } public List createLinkedList() { return new LinkedList(); } public List createList() { return new ArrayList(); }}

Listing 1 zeigt ein...

Java Magazin
Warum das C in CDI den Unterschied macht

Kontext ist alles

Immer mehr Dependency-Injection-(DI-)Frameworks erblicken das Licht der Welt, darunter auch „Dagger“ und „Boon“, die auf den folgenden Seiten vorgestellt werden. Darunter sind allerdings nur wenige CDI-Frameworks, was bedauerlich ist - schließlich ist das C (für „Contexts“) doch das eigentlich Interessante an CDI. Der folgende Beitrag zeigt, warum das C den Unterschied macht und wie man es einsetzen kann - übrigens nicht nur auf der Java-EE-Seite.

Sven Ruppert


Im Folgenden werden wir uns verschiedene Einsatzmöglichkeiten von CDI ansehen, an denen gezeigt wird, wofür das „C“ steht und weshalb es so nützlich ist. Dabei werde ich ausschließlich das Core-JDK und die CDI-Spezifikation verwenden. Als Basisimplementierung kommt der Weld-Container zum Einsatz.

Doch zunächst zu den Zielen von CDI: Hier gibt es sicher verschiedene Interpretationen. Wir gehen im Folgenden davon aus, dass wir eine Methode haben und nennen diese execute(). Als Rückgabewert kommt eine Liste zum Einsatz:

public List execute(){ ... };

Und hier fängt es schon an: Es handelt sich um ein Interface. Wir wissen also nicht, ob sich dahinter eine ArrayList oder eine LinkedList verbirgt. Es kann natürlich eine beliebige Implementierung sein. Und damit machen wir auch alles richtig, solange wir keine speziellen Methoden einer Implementierung auf diesem Rückgabewert anwenden wollen. Als Beispiel sei hier die Methode trimToSize() von der Implementierung ArrayList genannt. Aber ist damit eine Entkopplung erreicht? Ich sage einfach mal: nein. Doch wo beginnt eine Kopplung und wo endet sie? Sehen wir uns dazu erst einmal das Innenleben der Methode execute() an:

import java.util.List;import java.util.ArrayList; public List execute(){ final List result = new ArrayList(); //.... return result;}

Im Inneren haben wir uns für die Implementierung der ArrayList entschieden. Damit ist an dieser Stelle alles fest verdrahtet. Aber ergibt diese Entscheidung Sinn? Wir wissen es nur, wenn wir genug über die Eigenschaften der Anwendung wissen. Eigentlich wäre es nützlicher, zur Laufzeit zu entscheiden, welche Implementierung der Umgebung am besten entspricht. Aber nicht nur da haben wir uns in der statischen Semantik festgesetzt. Der Import ist natürlich genauso eine Kopplung. Aber dazu gleich mehr.

Wollen wir nun die Erzeugung der ArrayList auslagern, kann man zum Beispiel zu dem Pattern Factory greifen. Und damit man die Auswahl hat, welche Implementierung es werden soll, bietet uns die Factory gleich mehrere Methoden an. Selbstverständlich kann es auch durch Parameter gesteuert werden. Das macht aber für die Überlegung keinen Unterschied.

Listing 1import java.util.ArrayList;import java.util.LinkedList;import java.util.List; public class ListFactory { public List createArrayList() { return new ArrayList(); } public List createLinkedList() { return new LinkedList(); } public List createList() { return new ArrayList(); }}

Listing 1 zeigt ein...

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