Identité, égalité et objets valeur immuables
Informatique de gestion · Bachelor 2
Distinguer identité et égalité, redéfinir equals/hashCode et concevoir des objets valeur immuables.
Introduction
Deux références peuvent désigner le même objet (identité) ou deux objets distincts de même contenu (égalité). Confondre les deux est une source classique de bugs : en Java, l'opérateur == compare les références, tandis que equals compare le contenu s'il a été redéfini. Dans une application de gestion, deux objets Montant de 100 CHF doivent être considérés comme égaux, alors que deux clients homonymes ne le sont pas forcément.
Cette distinction fonde la différence entre entité, définie par une identité stable (numéro de client), et objet valeur, défini uniquement par ses attributs (Montant, Adresse, Période). Les objets valeur sont de préférence immuables : leur état ne change plus après construction, ce qui les rend sûrs à partager, à utiliser comme clés de table de hachage et à manipuler en concurrence.
Le contrat entre equals et hashCode est impératif : deux objets égaux doivent avoir le même code de hachage, faute de quoi les collections à base de hachage se comportent de manière incorrecte.
Objectifs d'apprentissage
- Distinguer identité (==) et égalité (equals)
- Redéfinir equals et hashCode en respectant leur contrat
- Différencier entité et objet valeur dans un modèle de domaine
- Concevoir une classe immuable et appliquer la copie défensive
- Expliquer les bénéfices de l'immutabilité pour le partage et la concurrence
Concepts clés
- Identité et égalité
- L'identité compare les références ; l'égalité compare un contenu défini par la classe via equals.
- Contrat equals/hashCode
- equals doit être réflexive, symétrique, transitive et cohérente ; deux objets égaux doivent avoir le même hashCode.
- Entité et objet valeur
- L'entité est définie par son identité qui persiste malgré les changements d'attributs ; l'objet valeur par ses attributs seuls et est remplaçable.
- Immutabilité
- Un objet immuable ne peut plus être modifié après construction : attributs finaux, pas de mutateurs, copies défensives pour les composants modifiables.
Conclusion
Savoir ce qui définit un objet, son identité ou ses attributs, est une compétence de modélisation autant que de programmation. Les objets valeur immuables simplifient le raisonnement et réduisent les bugs.
Respecter le contrat equals/hashCode et protéger l'état interne par des copies défensives sont des réflexes qui évitent des défauts très difficiles à repérer en production.
Cartes
- Que compare l'opérateur == sur des objets en Java ?
- Les références : il vaut vrai si les deux variables désignent exactement le même objet.
- Que doit faire equals pour un objet valeur Montant ?
- Comparer le contenu (valeur et devise) afin que deux Montant de même valeur soient égaux.
- Quel est le contrat entre equals et hashCode ?
- Si a.equals(b) est vrai, alors a.hashCode() == b.hashCode() ; l'inverse n'est pas exigé.
- Que se passe-t-il si on redéfinit equals sans hashCode ?
- Un objet inséré dans un HashSet ou un HashMap peut devenir introuvable, car son code de hachage ne correspond pas à l'égalité.
- Quelles sont les quatre propriétés de equals ?
- Réflexivité, symétrie, transitivité, cohérence (plus : x.equals(null) est faux).
- Qu'est-ce qu'un objet valeur ?
- Un objet défini seulement par ses attributs, sans identité propre, idéalement immuable (Montant, Adresse, Période).
- Qu'est-ce qu'une entité ?
- Un objet défini par une identité stable (numéro de client) qui reste la même malgré le changement de ses attributs.
- Comment rendre une classe immuable ?
- Classe finale ou non extensible, attributs privés et finaux, pas de mutateurs, copies défensives des composants modifiables.
- Pourquoi une copie défensive est-elle nécessaire ?
- Sans elle, l'appelant garde une référence vers un composant modifiable (liste, date) et peut changer l'état interne de l'objet immuable.
- Pourquoi utiliser des objets immuables comme clés d'une table de hachage ?
- Si la clé change après insertion, son code de hachage change et l'entrée devient introuvable.
Glossaire
- Identité
- Fait que deux références désignent le même objet en mémoire.
- Égalité logique
- Équivalence de contenu définie par la méthode equals.
- hashCode
- Entier calculé à partir de l'état d'un objet, utilisé par les structures à hachage.
- Objet valeur
- Objet sans identité propre défini par ses attributs, généralement immuable.
- Immutabilité
- Propriété d'un objet dont l'état ne peut plus changer après sa construction.
- Copie défensive
- Duplication d'un objet modifiable reçu ou renvoyé pour protéger l'état interne.