Adloun

programmation Java (école d'ingénieur) · Chapitre 9 · Exercice de TD

Une égalité qui n'est pas symétrique

Héritage et polymorphisme · niveau 3 (difficile)

Énoncé

La classe P (un point) définit


@Override public boolean equals(Object o) {
    return o instanceof P a && x == a.x && y == a.y;
}

et sa sous-classe PC (un point coloré) ajoute un attribut couleur et redéfinit


@Override public boolean equals(Object o) {
    return o instanceof PC a && super.equals(a) && couleur.equals(a.couleur);
}
  • Avec P p = new P(1, 2) et PC q = new PC(1, 2, "rouge"), que valent p.equals(q) et q.equals(p) ? Quelle propriété du contrat est violée ?
  • Pourquoi est-ce grave pour une collection ? Proposer une correction.

Corrigé

  • L'exécution donne true false : p.equals(q) est vrai (q est un P, mêmes coordonnées), mais q.equals(p) est faux (p n'est pas un PC). La symétrie est violée.
  • Une collection peut appeler a.equals(b) ou b.equals(a) selon l'ordre dans lequel les éléments ont été ajoutés : un ensemble pourrait alors contenir, ou non, « deux fois le même point » selon cet ordre. Une correction consiste à exiger que les deux objets soient de la même classe :

@Override public boolean equals(Object o) {
    if (o == null || getClass() != o.getClass()) return false;
    P a = (P) o;
    return x == a.x && y == a.y;
}

(et de même dans PC, en comparant aussi la couleur). Un point et un point coloré ne sont alors jamais égaux, dans un sens comme dans l'autre. Une autre solution est la composition : un PC a un P et une couleur, et n'hérite pas de P.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours, le premier QCM et 2 minutes de podcast et de vidéo. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →