Skip to content

Les entités

Dans cette section, nous allons revisiter les classes que nous avons écrites lors du jour 1.

Info

Nous appelons généralement Entité, une classe de domaine qui est la représentation classe d'une table dans la base de données. Dans ce cas, chaque ligne de ladite table est une instance d'objet de ladite classe.

Correspondance entre les types SQL et Java :

Types SQL Types Java
BIGSERIAL: BIGINT auto-incrementé long
CHAR(n) String
VARCHAR: CHAR(n) avec une longueur variable String
DOUBLE PRECISION double
INT int

Builder pattern

Partons du principe que, lorsque l'on crée un voyage, on ne connaît pas toutes les informations dès le départ. On voudrait donc pouvoir créer un objet voyage en se passant de certains attributs, pour les préciser dans un second temps.

Pour créer un Travel avec uniquement un nom, nombre de places, aéroport de départ et d'arrivée, on doit appeler le constructeur avec des valeurs nulles.

// Create
Travel travel = new Travel(
        1,
        "Voyage vers les montagnes", 
        20,
        Airport.PARIS_CHARLES_DE_GAULLE, 
        Airport.TOKYO_HANEDA,
        Instant.now(),
        Instant.now().plusSeconds(86400),
        "France",
        0.0, //null
        null, //disocunts
        null, //participants
        null; //waitList

Le constructeur ci-dessus n'est pas très pratique, car il nécessite un grand nombre de paramètres dans un ordre très spécifique. Le design pattern Builder est une bonne solution pour contourner ce problème.

Travel.Builder

  • Créez une nouvelle classe statique Builder à l'intérieur de la classe Travel.
Travel.Builder
public class Travel {
  // ...
  public static Builder builder() {
      return new Builder();
  }

  public static Builder builder(Travel travel) {
      return new Builder(travel);
  }

  public static final class Builder {
      private Long id;
      private String name;
      private Airport departureAirport;
      private Airport arrivalAirport;
      private Instant departureDate;
      private Instant arrivalDate;
      private String destination;
      private int capacity;
      private double price;
      private List<Discount> discounts;
      private Set<User> participants;
      private Queue<User> waitingParticipants;

      public Builder() {
      }

      public Builder(Travel travel) {
          this.id = travel.id;
          this.name = travel.name;
          this.departureAirport = travel.departureAirport;
          this.arrivalAirport = travel.arrivalAirport;
          this.departureDate = travel.departureDate;
          this.arrivalDate = travel.arrivalDate;
          this.destination = travel.destination;
          this.capacity = travel.capacity;
          this.price = travel.price;
          this.discounts = travel.discounts;
          this.participants = travel.participants;
          this.waitingParticipants = travel.waitingParticipants;
      }

      public Builder id(Long id) {
          this.id = id;
          return this;
      }

      public Builder name(String name) {
          this.name = name;
          return this;
      }

      public Builder departureAirport(Airport departureAirport) {
          this.departureAirport = departureAirport;
          return this;
      }

      public Builder arrivalAirport(Airport arrivalAirport) {
          this.arrivalAirport = arrivalAirport;
          return this;
      }

      public Builder departureDate(Instant departureDate) {
          this.departureDate = departureDate;
          return this;
      }

      public Builder arrivalDate(Instant arrivalDate) {
          this.arrivalDate = arrivalDate;
          return this;
      }

      public Builder destination(String destination) {
          this.destination = destination;
          return this;
      }

      public Builder capacity(int capacity) {
          this.capacity = capacity;
          return this;
      }

      public Builder price(double price) {
          this.price = price;
          return this;
      }

      public Builder disocunts(List<Discount> discounts) {
          this.discounts = discounts;
          return this;
      }

      public Builder participants(List<User> participants) {
          this.participants = participants;
          return this;
      }

      public Builder waitingParticipants(List<User> waitingParticipants) {
          this.waitingParticipants = waitingParticipants;
          return this;
      }

      public Travel build() {
          return new Travel(id, name, departureAirport, arrivalAirport, departureDate, arrivalDate, 
                            destination, capacity, price, discounts, participants, waitingParticipants);
      }
  }
}

On pourra utiliser ce builder afin de créer des Travel comme suit :

Travel travel = Travel.builder()
            .id(1)
            .name("name")
            .departureDate(Instant.now())
            .arrivalDate(Instant.now().plusSeconds(86400))
            .departureAirport(Airport.PARIS_CHARLES_DE_GAULLE)
            .arrivalAirport(Airport.TOKYO_HANEDA)
            .destination("destination")
            .capacity(10)
            .price(350.00)
            .build();

À vous de jouer

Maintenant, c'est à vous de réaliser le User.Builder.

Fichiers modifiés

src/main/java/io/takima/agencymanagement/App.java
src/main/java/io/takima/agencymanagement/model/Travel.java
src/main/java/io/takima/agencymanagement/model/User.java

N'oubliez pas de Commit votre travail !