Immutabilité
1. Introduction
Il est important de chercher à rendre les objets immuables. Les objets immuables ont beaucoup d'avantages :
- facile à manipuler
- facile à concevoir
- diminue les risques d'erreur
- plus sécurisé
La librairie de base de la JDK contient énormément de classes immuables que l'on utilise régulièrement. Les primitives bien sur mais aussi les wrappers , String, BigInteger, BigDecimal, ... Tous ces objets n'ont aucune méthode pour modifier l'état de l'objet par exemple.
BigInteger somme = BigIneter.ZERO;
for(BigInteger surface : surfaces) {
somme = somme.add(surface);
}
2. Comment fait on une classe immuable ?
Pour qu'une classe soit immuable, il faut :
- aucune méthode qui modifie l'objet
- Tous les attributs sont final
- Tous les attributs sont private
- Tous les attributs doivent être des attributs immuables
- La classe doit être final
3. Avantages
- Simple d'utilisation, un objet représente un état défini à sa création.
- Sécurisé car Thread-safe par nature (pas de synchronisation à gérer
- Encourage la réutilisation (ex BigDecimal.ZERO)
- Non seulement on peut partager des objets immuables mais ils peuvent partager également des parties internes de leur représentation (ex: méthode negate de Bigdecimal)
- d
- Moins d'erreur car l'objet est consistant dès sa création.
4. Inconvénients
Le principal inconvénient est la multiplication d'objets lors de certaines actions. La solution est plutôt simple : elle consiste à la mise en place d'une classe mutable de notre classe. L'exemple le plus connu est la classe StringBuilder qui permet donc de manipuler la classe immuable String.
5.Conclusion
Au tant que possible, il faut construire des classes immuables afin de limiter au maximum la mutabilité. La mutabilité doit être justifié. Plusieurs autres points des bonnes pratiques permettent d'aller dans ce sens (factory, builder,...).