© Excellent backgrounds/Shutterstock.com
Die Designmuster der „Gang of Four“ in Zeiten von Java 8

Das Auge codet mit


Das Standardwerk zu Designmustern „Design Patterns“ blickt auf eine zwanzigjährige Geschichte zurück. Aufgrund technischer Weiterentwicklungen gibt es heute viele interessante Konzepte, die diese Muster teilweise oder vollständig ersetzen. Die Spanne reicht dabei von funktionalen Ansätzen mit Java-8-Bordmitteln über den Einsatz spezieller Laufzeitumgebungen und Bibliotheken bis hin zu anderen JVM-basierten Sprachen.

Das Designmusterbuch von Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides, das oft als „Gang of Four (GoF)“ referenziert wird, ist heutzutage in vielen Bibliotheken wiederzufinden, die Muster auch direkt im JDK. Sie sind ein fester Bestandteil im Werkzeugkasten der meisten Entwickler. Bereits 1996 merkte Peter Norvig in seinem Vortrag „Design Patterns in Dynamic Programming“ [1] an, dass es eine Eigenschaft von Designmustern sei, Beschränkungen der verwendeten Programmiersprache zu vermeiden. Das mag 1996 auch auf die damals aktuelle Java-Version 1.0 zugetroffen haben. In diesem Artikel präsentieren wir, wie sich die Implementierungen der Designmuster mit den in Java 8 eingeführten funktionalen Ansätzen und durch neue Entwicklungen im JVM-Ökosystem verändert haben. Außerdem gehen wir auf eine Auswahl neuer Muster ein, welche noch nicht im Designmusterbuch enthalten sind, aber heutzutage ebenfalls zum Stand der Technik zählen.

Muster für Struktur

Der Adapter ist ein oft genutztes Muster, das der Compiler in Java 8 teilweise nativ unterstützt. Dies ist implizit immer dann der Fall, wenn es sich um Interfaces handelt, die nur über eine Methode verfügen – mit Ausnahme von ebenfalls zulässigen Default-Methoden. Derartige Interfaces lassen sich mit der @FunctionalInterface-Annotation bei ihrer Deklaration explizit als solche markieren, wodurch der Compiler das Erweitern um zusätzliche Methoden verbietet.

Was aber hat das nun mit dem Adaptermuster zu tun? Den Typ von Lambda-Ausdrücken kann der Java-Compiler in den meisten Fällen aus dem Kontext ableiten, wobei der gleiche syntaktische Ausdruck je nach Anwendungskontext einen anderen Typ haben kann. Lediglich die Signatur der Methode mit Ausnahme des Namens muss übereinstimmen. Das klingt komplizierter als es in der Praxis tatsächlich ist. Folgendes Codebeispiel zeigt, wie eine einzige klassische Java-Methode zu verschiedenen Typen adaptiert wird. Dabei muss der Entwickler sich nicht mehr mit der Implementierung eines expliziten Adapters aufhalten. Der Compiler geht sogar so weit, dass Box...

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