UP | HOME

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.

Version history: v1: 2015-11-02; v2: 2016-11-08[update].
Comments or questions: Send a mail.
The webpage content is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.