Substitution de la java de la méthode equals () - pas de travail?

J'ai couru dans une intéressante (et très frustrant) problème avec le equals() méthode aujourd'hui, ce qui a causé ce que je pensais être un bien testé la classe de crash et de provoquer un bug qui m'a pris un temps très long à repérer.

Juste pour être complet, je n'étais pas à l'aide d'un IDE ou un débogueur - juste de la bonne vieille éditeur de texte et du Système.out. Le temps était très limité et que c'était un projet d'école.

De toute façon -

J'ai été l'élaboration d'une base panier qui pourrait contenir un ArrayList de Book objets. Afin de mettre en œuvre les addBook(), removeBook(), et hasBook() méthodes de la Charrette, je voulais vérifier si le Book existait déjà dans le Cart. Donc me voilà -

public boolean equals(Book b) {
    ... //More code here - null checks
    if (b.getID() == this.getID()) return true;
    else return false;
}

Tous fonctionne très bien dans les tests. J'ai créer 6 objets et de les remplir avec des données. Faire beaucoup de ajoute, supprime, a() les opérations sur la Cart et tout fonctionne bien. J'ai lu que vous pouvez soit equals(TYPE var) ou equals(Object o) { (CAST) var } mais suppose que depuis qu'il travaillait, il n'a pas trop d'importance.

Puis j'ai rencontré un problème - j'avais besoin de créer un Book objet avec seulement la ID à partir du Livre de classe. Pas d'autres données serait entré en elle. Essentiellement les suivantes:

public boolean hasBook(int i) {
    Book b = new Book(i);
    return hasBook(b);
}

public boolean hasBook(Book b) {
    //.. more code here
    return this.books.contains(b);
}

Tout d'un coup, le equals(Book b) méthode ne fonctionne plus. Cela a pris un temps TRÈS long à repérer sans un bon débogueur et en supposant que le Cart classe a été testé correctement et de les corriger. Après swaapping la equals() méthode à la suivante:

public boolean equals(Object o) {
    Book b = (Book) o;
    ... //The rest goes here   
}

Tout a commencé à travailler à nouveau. Est-il une raison, la méthode décidé de ne pas prendre le Livre paramètre, même si c'est clairement la a un Book objet? La seule différence semble être que c'était instancié à partir de l'intérieur de la même classe, et remplis avec un membre de données. Je suis très très confus. S'il vous plaît, jeter un peu de lumière?

  • Je suis conscient que j'ai violé le "Contrat" concernant la substitution de l'égal des méthodes en cours de réflexion cependant j'ai besoin d'un moyen rapide de vérifier si l'objet existe dans la liste de tableaux sans l'aide de médicaments génériques.
  • C'est une bonne leçon à apprendre Java et est égale à
InformationsquelleAutor Josh Smeaton | 2008-10-09