Objets immuables et Builder Pattern

C'est toujours une bonne idée de rendre ses objets immuables. Un objet immuable ne change jamais d'état, il reste le même qu'à sa création. Tous les paramètres sont donnés lors de la construction de l'objet. Si une classe ne peut pas être rendue immuable, il est préférable de limiter sa mutabilité au minimum nécessaire.

Pourquoi créer des classes immuable ?

  1. Elles sont thread safe et ne nécessitent pas de synchronisation.
  2. Elles sont moins boguées puisqu'elles n'ont pas de changements d'états innatendues.

Exemple d'une classe immuable

Une classe est immuable lorsqu'elle ne propose aucun mutateur (setters), que tous les champs sont finaux et privés et que la classe elle-même soit finale (final) ou qu'elle possède un constructeur privé.


public final class Product {
   private final String name;
   private final double price;
   
   public Product(String name, double price) {
      this.name = name;
      this.price = price;
      }
      
   public String getName() {
      return name;
   }
   
   public String getPrice() {
   return price;
   }
}

Builder Pattern (monteur)

D'après Wikipédia : "Le monteur (builder) est un patron de conception utilisé pour la création d'une variété d'objets complexes à partir d'un objet source."


public final class ProductBuilder {
   private String name;
   private double price;
      
   public void name(String name) {
      this.name = name;
   }
   
   public void price(double price) {
      this.price = price;
   }
   
   public Product build(){
       return new Product(this.name, this.price);
   }
}

On peut lever des exceptions lorsqu'un paramètre n'est pas correct dans le monteur.

Commentaires