Lombok Beispiel
Zunächst möchte ich ein kurzes Beispiel geben, für einen typischen Builder welcher mit Lombok erstellt wurde. Der Source Code des Builders ist nur über das Delombok Feature sichtbar, er wird normalerweise nicht generiert. Daher zeige ich hier nur die annotierte Domain Klasse Person und den Unittest welche den PersonBuilder nutzt.
Person.java
import lombok.Builder;
import lombok.NonNull;
import java.time.LocalDate;
@Builder
public class Person {
// State new
@NonNull
protected double birthWeight;
@NonNull
protected LocalDate birthday;
protected String firstname;
protected String surename;
// State birth
protected int standesamtNummer;
protected int registerNummer;
protected int birthYear;
// State citizen
protected String address;
protected String taxID;
}
// @NonNull
// protected int birthHeight;
// @NonNull
// protected int birthHeadCirc;
// @NonNull
// protected LocalDate birthday;
// @NonNull
// protected String birthAddress;
// @NonNull
Die Builderklasse Person.PersonBuilder erlaubt es auf einfache Weise Instanzen der Klasse Person zu erzeugen. Wobei die Reihenfolge in der die Attribute der Instanz belegt werden keine Rolle spielt. Ein Beispiel stellt folgender Test dar:
PersonBuilderTest.java
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.time.LocalDate;
import static org.junit.jupiter.api.Assertions.*;
class PersonBuilderTest {
@Test
@DisplayName("Erzeugt eine gültige Person ohne Adresse")
void initPerson() {
final Person person = new Person.PersonBuilder()
.birthday(LocalDate.of(1969, 1, 1))
.firstname("Maik")
.surename("Kalauer")
.address("Schildbürgerstr. 8, Siebensanden")
.build();
assertNotNull(person);
assertNotNull(person.address);
}
@Test
@DisplayName("Erzeugt eine gültige Person ohne Adresse")
void initObdachlosePerson() {
final Person person = new Person.PersonBuilder()
.birthday(LocalDate.of(1969, 1, 1))
.firstname("No")
.surename("Body")
.build();
assertNotNull(person);
assertNull(person.address);
}
@Test
@DisplayName("Erzeugt eine ungültige Person ohne Geburtsdatum")
void initInvalidPerson() {
final Person.PersonBuilder builder = new Person.PersonBuilder()
.firstname("Arno")
.surename("Nym")
.address("Heinzelmannstr. 8, Mainz");
assertNotNull(builder);
assertThrows(NullPointerException.class, builder::build);
}
}
Weiter zum Beispiel mit Zuständen oder zurück zur Motivation.