Données immutables : intérêt du partage
Lorsque les données sont immutables, si dans son code on s'abstient de différencier les références par un test d'égalité (avec ==), il est licite de remplacer les fabriques par des fabriques poids plume, qui ne construisent qu'un unique objet pour une valeur donnée. En effet, dans cette situation, les références sont transparentes, autrement dit les références aux objets n'importent pas : on peut remplacer la construction d'un nouvel objet par l'utilisation d'un objet existant de même valeur (au sens d'equals).
Comment procéder ? Implémenter avec une table de hachage les méthodes de fabrique remplaçant les constructeurs.
// La table de hachage private Map<Cle, A> table = HashMap<>(); // Calcul de la clé à partir des arguments du constructeur private Cle valeurCle(Args args) { ... } // Fabrique remplaçant le constructeur A creer(Args args){ // Calcul de la clé Cle k = valeurCle(args); // Récupération dans la table de l'éventuel objet associé A r = table.get(k); if(r == null){ // En l'absence d'objet, construction et mise en table. r = new A(args); table.put(k, r); } return r; }
Lorsqu'on utilise une table de hachage, il est nécessaire de récrire la méthode hashCode héritée de la classe Object. On doit vérifier la propriété suivante : si deux objets de type A sont égaux au sens d'equals, il doivent avoir la même valeur de hachage. Comment calculer la valeur de hachage ? Cf. l'ouvrage Effective Java, de Joshua Bloch, qui fournit une recette simple et efficace. Noter aussi que le type des clés doit être immutable pour que la table fonctionne correctement.