Builder avec Lombox
En complément de la génération automatique des accesseurs, Lombok
permet de générer une classe Builder
facilitant la création d'instance de POJO.
Le code source est disponible à l'adresse suivante: http://www.svn.jouvinio.net/study/trunk/lombok, et en particulier les classes du package fr.ejn.tutorial.java.lombok.builder
.
Votre avis
Nobody voted on this yet
|
|
Builder
L'ajout de l'annotation Builder
sur la classe va mettre à disposition une nouvelle fonction static builder
retournant une instance d'une nouvelle classe. Il est alors possible d'instancier un POJO en appelant successivement des setter
, dont le nom correspond aux variables, et en finalisant par la fonction build
. Dans le cadre de la classe DataWithBuilderObject
, trois variables sont disponibles.
- id;
- name;
- surname.
package fr.ejn.tutorial.java.lombok.builder;
import lombok.Builder;
import lombok.Getter;
/**
* Tutorial class to illustrate generation of a builder.
*
* @author Etienne Jouvin
*
*/
@Builder
@Getter
public class DataWithBuilderObject {
private String id;
private String name;
private String surname;
}
A noter que l'annotation Setter
n'est pas mise dans la classe. L'instanciation ne peut alors se faire qu'à travers le builder comme illustrer dans le test unitaire DataWithBuilderObjectTest
.
package fr.ejn.tutorial.java.lombok.builder;
import static org.assertj.core.api.Assertions.assertThat;
import org.assertj.core.api.Assertions;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class DataWithBuilderObjectTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testBuilder() throws Exception {
DataWithBuilderObject actual = DataWithBuilderObject.builder().id("data id").name("data name")
.surname("data surname").build();
assertThat(actual.getId()).isEqualTo("data id");
assertThat(actual.getName()).isEqualTo("data name");
assertThat(actual.getSurname()).isEqualTo("data surname");
}
}
Personnalisation Builder
Avec l'annotation Builder
une nouvelle classe est mise en place, contenant un ensemble de fonctions pour construire les instances. Dans de rare cas, il peut être souhaité de modifier la nomenclature. la classe DataWithCustomBuilderObject
présente un exemple où les modifications suivantes sont aportées.
- Nom de la classe générée pour le builder en
DataBuilder
; - Nom de la fonction d'initialisation du builder en
newBuilder
; - Nom de la fonction de création de l'instance en
create
.
package fr.ejn.tutorial.java.lombok.builder;
import lombok.Builder;
import lombok.Getter;
/**
* Tutorial class to illustrate generation of a builder.
*
* @author Etienne Jouvin
*
*/
@Builder(builderMethodName = "newBuilder", buildMethodName = "create", builderClassName = "DataBuilder")
@Getter
public class DataWithCustomBuilderObject {
private String id;
private String name;
private String surname;
}
Le test unitaire DataWithCustomBuilderObjectTest
utilise ce nouveau builder généré, metant en évidence les modifications.
package fr.ejn.tutorial.java.lombok.builder;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import fr.ejn.tutorial.java.lombok.builder.DataWithCustomBuilderObject.DataBuilder;
public class DataWithCustomBuilderObjectTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testBuilder() throws Exception {
DataBuilder builder = DataWithCustomBuilderObject.newBuilder();
builder.id("data id").name("data name").surname("data surname");
DataWithCustomBuilderObject actual = builder.create();
assertThat(actual.getId()).isEqualTo("data id");
assertThat(actual.getName()).isEqualTo("data name");
assertThat(actual.getSurname()).isEqualTo("data surname");
}
}
A noter que les instructions ne sont pas enchaînées. Cela est fait juste à but informatif.
Voir aussi
Documentation officielle: https://projectlombok.org/features/Builder