Weniger Boilerplate Code mit Lombok

Einer der Kritikpunkte an Java ist die Menge an Boilerplatecode die für Programme benötigt wird. Boilerplate Code, das ist immer wiederkehrender Code der für ein lauffähiges Programm benötigt wird. Das gilt insbesondere für einfache Klassen die nur ein paar Werte enthalten. Für jede Property werden Getter und Setter Methoden benötigt. Auch equals() , hashCode()  und toString() Methoden werden sehr oft überschrieben. Sehr schnell kommen so für ein paar Properties viele Zeilen Code zusammen, die in anderen Programmiersprachen (z.B. Scala und Groovy) nur wenige Zeilen benötigen. Entwicklungswerkzeuge wie Eclipse und Intellij IDEA helfen Entwicklern, in dem sie Codegeneratoren bereitstellen, die solchen Boilerplatecode generieren können. Doch selbst wenn man den Code nicht selbst schreiben muss, blähen diese Teile den Code auf. Das hat zur Folge, dass man durch viel mehr Code scrollen muss und wird so von den wesenlichen Funktionen abgelenkt.

Project Lombok ist ein kleines Framework, das Boilerplatecode beim Kompilieren hinzufügt. man bekommt den generierten Code nie zu Gesicht. Lombok stellt Annotationen zur Verfügung die in den Code geschrieben werden um zu bestimmen an welcher Stelle Code generiert werden soll. Die @Data  Annotation zum Beispiel generiert Getter für alle Felder, Setter für alle nicht „final“ Felder, einen Konstruktor mit allen „final“ Feldern als Paremter sowie, equals() , hashCode()  und toString()  Methoden.

Folgendes Beispiel soll die Verwendung der @Data  Annotation veranschaulichen:

stehe für folgenden Code, der beim Kompilieren generiert wird: (scrollen nicht vergessen)

Die Vorteile der besseren Übersichtlichkeit des Codes liegen auf den Hand.

Einrichtung der Entwicklungsumgebung

Um Lombok benutzen zu können, muss die Bibliothek beim Bauen eingebunden werden. In einem Maven Projekt muss in der Maven POM folgende Dependency eingebunden werden:

Die Konfiguration für andere Build Werkzeuge kann auf der Lombok Seite unter Install nachgeschaut werden.

Auch die Entwicklungsumgebungen müssen für die Unterstützung von Lombok eingerichtet werden. Die meisten bieten eine sehr gute Unterstützung für Lombok und unterstützen alle von Lombok bereitgestellten Annotationen. Dann stehen alle generierten Funktionen zur Verfügung, als wäre der generierte Code bereits vorhanden. Lombok Unterstützung gibt es ebenfalls bei Refactoring Funktionen der IDEs.

Ich persönlich nehme IntelliJ für die Entwicklung. Dafür gibt es das Lombok Plugin, das unter Settings > Plugins > Lombok Plugin installiert werden kann. Für die Eclipse Unterstützung enthält das lombok.jar  einen Installer, der die Unterstützung einrichtet. Hilfe bei der Einrichtung für andere IDEs gibt es auf der Webseite.

Einrichtung von Lombok für verschiedene Entwicklungswerkzeuge

Konfiguration der Code Generierung

Manchmal machen die Lombok Annotationen zu viel, oder man möchte ausgewählten Code selbst schreiben. Lombok überschreibt keinen selbst geschriebenen Code. Wenn eine Methode bereits existiert die generiert werden soll z.B. toString() , oder setValue(String x) , wird der existierende Code von Lombok nicht überschrieben. Das ist nützlich, um einzelne Setter oder Getter mit besonderer Funktionalität selbst zu implementieren. Mit Lombok gehen selbst implementierte Methoden nicht im Boilerplate Code unter.

Die @Data  Annotation ist eine Kurzform für mehrere Lombok Annotationen: @ToString, @EqualsAndHashCode, @Getter, @Setter und @RequiredArgsConstructor. Bei Bedarf können diese Annotationen beliebig kombiniert werden.

Viele Annotationen haben optionale Parameter, mit denen die Codegenerierung feinjustiert werden kann. Mit @EqualsAndHashCode(exclude={"description"}) können zum Beispiel Felder aus der equals und hashCode Methode entfernt werden. Der Parameter callSuper  in @EqualsAndHashCode(callSuper = true) konfiguriert, dass die equals()  und hashCode()  Methode aufgerufen werden soll. Diese Einstellung ist besonders bei Klassen wichtig, die von anderen abgeleitet sind. Alle Konfigurationsmöglichkeiten sind auf der Lombok Webseite gut dokumentiert.

Nützliche Annotationen

Abschließend möchte ich noch kurz auf die von mir am meisten genutzen Lombok Annotationen kurz vorstellen.

  • @Data generiert Getter für alle Felder, Setter für all nicht „final“ Felder, einen Konstruktor mit allen „final“ Feldern sowie, equals() , hashCode()  und toString()  Methoden.
  • @Value ist die immutable Variante von @Data zum Erstellen von Value Klassen. Alle Attribute der Klasse werden als private und final deklariert.
  • @NoArgsConstructor , @RequiredArgsConstructor  and @AllArgsConstructor generiert Konstruktoren. Sehr hilfreich im Zusammenhang mit der Spring Konstruktor Autowire Unterstützung.
  • @NonNull wirft eine NullPointerException, wenn Parameter, die mit dieser Annotation versehen sind, aufgerufen wird. Ähnlich Objects.requireNonNull().
  • @Builder erstellt eine Fluent Builder API für Klassen. Siehe Dokumentation.
  • @Log ( @Slf4J ) generiert ein Loggerfeld mit Namen log

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.