Weniger aber ausdrucksstarker Code mit Project Lombok

3 Kommentare

Es gibt Libraries und Frameworks, die gehören zum täglichen Handwerkszeug eines Java-Entwicklers. Sei es das bevorzugte Test-Framework oder nützliche Libraries wie Guava. Für mich gehört seit langer Zeit Project Lombok dazu. Es erfüllt drei Kriterien, die mir im Entwickleralltag sehr wichtig sind: Lombok erlaubt mir überflüssigen Boilerplate Code zu vermeiden, reduziert Fehlerquellen und spielt sehr gut mit anderen Frameworks zusammen.

Warum ich von Lombok so begeistert bin, lässt sich mit einem Blick auf etwas Code, der sich so oder so ähnlich in vielen Java-Projekten finden lässt, demonstrieren:

public class Person {
    private String firstName;
    private String familyName;
 
    public Person(String firstName, String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getFamilyName() {
        return familyName;
    }
 
    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
 
        Person person = (Person) o;
 
        if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) return false;
        return !(familyName != null ? !familyName.equals(person.familyName) : person.familyName != null);
    }
 
    @Override
    public int hashCode() {
        int result = firstName != null ? firstName.hashCode() : 0;
        result = 31 * result + (familyName != null ? familyName.hashCode() : 0);
        return result;
    }
 
    @Override
    public String toString() {
        return "Person{" +
               "firstName='" + firstName + '\'' +
               ", familyName='" + familyName + '\'' +
               "}";
    }
}

Was direkt auffällt: In Java ist relativ viel Code notwendig um sehr wenig auszudrücken. In der Tat überlassen es viele Entwickler der IDE, den Code zu generieren und hier fängt das Problem an: Sobald eine Klasse verändert wird, müssen auch equals, hashCode und toString berücksichtigt und neue Getter und Setter geschrieben werden. Natürlich ist dies beonders fehleranfällig, wenn unter Zeitdruck noch schnell eine Klasse angepasst werden muss. Sprachen wie Scala und Groovy können dies definitiv besser.

Hier kommt Lombok ins Spiel, denn mit einer einzigen Annotation sieht die selbe Klasse schon viel übersichtlicher aus:

@Data
public class Person {
    private String firstName;
    private String familyName;
 
    public Person(String firstName, String lastName){
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

Lombok generiert für uns alle Getter, Setter sowie hashCode, equals und toString. Da das Ganze zur compile time passiert, spielt Lombok auch sehr gut mit anderen Frameworks wie JPA zusammen.

Auch für die Generierung von Konstruktoren gibt es Annotationen (@Data) von Lombok:

@Data
@AllArgsConstructor
public class Person {
    private String firstName;
    private String familyName;
}

Ein weiterer Vorteil: Lombok ergänzt nur die fehlenden Methoden. Wenn es also einen Getter oder Setter gibt, der vom Standard abweicht, kann er problemlos ergänzt werden. Dieser fällt dann in der Klasse auch gleich viel stärker auf.

@Data
@AllArgsConstructor
public class Person {
    private String firstName;
    private String familyName;
 
    public void setFamilyName(String familyName){
        if(familyName == null || familyName.isEmpty()){
            throw new IllegalArgumentException("Family name must be set.");
        }
        this.familyName = familyName;
    }
}

Aber Lombok kann noch mehr: Sobald Vererbung ins Spiel kommt, lässt sich einfach festlegen ob hashCode, equals und toString auch die Felder der Elternklasse berücksichtigen sollen:

@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class Developer extends Person{
    private String favoriteFramework;
}

Das Einsatzgebiet von Lombok beschränkt sich nicht nur darauf Java POJOs mit weniger Code zu schreiben. Auch für andere Dinge kann Lombok verwendet werden:

Lombok im Projekt verwenden

Alle notwendigen Informationen zu den Maven-Koordinaten (bzw. Ivy und Gradle) findet man auf der Download-Seite. Auf dieser Seite sind auch die IDE Plugins aufgelistet, die Lombok-Support anbieten. Dies ist gerade für Funktionen wie Autovervollständigung notwendig.

Für Eclipse reicht es die aktuelle Version von Lombok zu laden und das jar auszuführen. Es öffnet sich eine grafische Oberfläche die den Anwender durch die Installation führt. In IntelliJ kann das Plugin über die Plugin-Verwaltung installiert werden.

Alle, die gerne weniger Code schreiben möchten, sollten Lombok eine Chance geben. Was sind Eure bevorzugten Libraries und warum? Schreibt doch einen Kommentar und erzählt mehr über Eure Werkzeuge.

Tags

Daniel Mies

Daniel ist als Entwickler und IT Consultant sowohl im Backend als auch im Frontend unterwegs. Er interessiert sich besonders für Reaktive Programmierung und hier speziell Scala und Akka.

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentare

Kommentieren

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