equals()今日のメソッドで興味深い(そして非常にイライラする)問題に遭遇したため、十分にテストされたクラスであると考えていたクラスがクラッシュし、追跡に非常に長い時間がかかるバグが発生しました。
完全を期すために、私はIDEやデバッガーを使用していませんでした。古き良き昔ながらのテキストエディターとSystem.outを使用しています。時間は非常に限られており、学校のプロジェクトでした。
とにかく-
私は含めることができ、基本的なショッピングカート開発していたArrayListのBookオブジェクトを。実現するためにはaddBook()、removeBook()、およびhasBook()カートの方法を、私はかどうかを確認したかっBook既に存在していましたCart。だから私は行く-
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
テストではすべて正常に動作します。6つのオブジェクトを作成し、データを入力します。で多くの追加、削除、has()操作を実行するCartと、すべてが正常に動作します。私はあなたが持ってequals(TYPE var)equals(Object o) { (CAST) var }いることができるか、しかしそれが働いていたのでそれはあまり問題ではなかったと仮定して読んだと読んだ。
それから私はこの問題に遭遇した-私が作成するために必要Bookでオブジェクトを唯一ID Bookクラス内からインチ 他のデータは入力されません。基本的には次のとおりです。
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);
}
突然、このequals(Book b)方法は機能しなくなりました。これは、優れたデバッガーがなく、Cartクラスが適切にテストされ、正しいものであると想定して追跡するのに非常に長い時間がかかりました。swaappingした後equals()、次のメソッドを:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
すべてが再び機能し始めました。それが明らかにBookオブジェクトであったとしても、メソッドがBookパラメーターを取らないことに決めた理由はありますか?唯一の違いは、それが同じクラス内からインスタンス化され、1つのデータメンバーでのみ満たされたように見えた。私は非常に混乱しています。光を当ててください