Builder avec Lombox

De EjnTricks
Révision de 23 février 2018 à 17:50 par Etienne (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

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.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Robot-icon.png 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");
  }

}


Configuration-icon.png 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.


Viewer icon.png Voir aussi

Documentation officielle: https://projectlombok.org/features/Builder