next up previous contents index
suivant: Généricité monter: La classe Object et précédent: Réflexivité   Table des matières   Index


Égalité

La méthode equals permet de tester l'égalité de deux objets. La méthode définie dans la classe Object est la plus discriminante possible, ce qui signifie que x.equals(y) retourne true si et seulement si x et y sont des références au même objet, c'est-à-dire si x == y. Par exemple, si la classe Point ne redéfinit pas equals, la valeur de l'expression

       new Point().equals(new Point())

qui compare deux instances différentes, retourne false. Il est donc utile de redéfinir equals. Dans le cas de la classe Point, un point est égal à un objet o si o est un point et si les champs correspondants sont égaux. L'expression o instanceof Point, de type boolean, permet de tester si le type de l'objet désigné par o est un sous-type de Point :

package geometrie;

class Point {
  // ...
  public boolean equals(Object o) {
    return o instanceof Point && 
      this.x == ((Point)o).x && 
      this.y == ((Point)o).y;
  }
}

Il serait tentant de définir une méthode qui compare seulement des instances de Point entre elles :

class Point {
  // ...
  boolean equals(Point p) { ... }
}

Cependant, ce ne serait pas une redéfinition de la méthode equals de la classe Object, car elle n'a pas le même profil, donc le mécanisme de liaison tardive ne l'invoquera pas. Dans la situation suivante, l'égalité des deux points serait donc testée à l'aide de l'equals d'Object et non par celle de Point :

  Object o = new Point(), p = new Point(1, 2);
  boolean b = o.equals(p);

D'autre part, toute classe qui redéfinit equals doit aussi redéfinir hashCode ; en effet, deux objets égaux par equals doivent avoir la même valeur de hachage par hashCode, ce qui est requis s'ils doivent être ajoutés à une table de hachage (voir § 6.4). En voici une définition possible :

  public int hashCode() {
    long bits = Double.doubleToLongBits(this.x);
    bits ^= Double.doubleToLongBits(this.y) * 31;
    return (int) bits ^ (int) (bits >> 32);
  }


next up previous contents index
suivant: Généricité monter: La classe Object et précédent: Réflexivité   Table des matières   Index
Rene' LALEMENT 2002-11-07