J'ai couru dans une intéressante (et très frustrant) problème avec la méthode equals() 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 pouvant contenir une liste de tableaux de Réserver des objets. Afin de mettre en œuvre les addBook(), removeBook(), et hasBook() les méthodes de la Charrette, je voulais vérifier si le Livre existait déjà dans le panier. 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() opérations sur le Panier et tout fonctionne bien. J'ai lu que vous pouvez avoir equals(TYPE var) ou equals(Object o) { (CAST) var } mais suppose que depuis qu'il travaillait, il n'a pas trop d'importance.
Ensuite, j'ai couru dans un problème - j'avais besoin de créer un Livre-objet avec seulement l'ID de l'intérieur de la classe Book. 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.equals(b);
}
Tout d'un coup, la equals(Livre 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 la classe Cart a été testé correctement et de les corriger. Après swaapping la méthode equals() pour les éléments suivants:
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 elle a clairement été un Livre-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?