今日、メソッドで興味深い (そして非常に苛立たしい) 問題に遭遇しましたequals()
。これにより、十分にテストされたクラスと思われるものがクラッシュし、追跡に非常に長い時間がかかったバグが発生しました。
完全を期すために、私は IDE やデバッガーを使用していませんでした。古き良きテキスト エディターと System.out だけです。時間は非常に限られており、それは学校のプロジェクトでした。
とにかく -
オブジェクトArrayList
をBook
含むことができる基本的なショッピングカートを開発していました。Cart の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 クラス内からのみBook
を含むオブジェクトを作成する必要がありました。他のデータは入力されません。基本的には次のとおりです。ID
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
適切なデバッガーがなく、クラスが適切にテストされ、正しいと仮定すると、これを追跡するのに非常に長い時間がかかりました。メソッドを次のように交換equals()
した後:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
すべてが再び機能し始めました。明らかにBook
オブジェクトであるにもかかわらず、メソッドが Book パラメーターを取らないことにした理由はありますか? 唯一の違いは、同じクラス内からインスタンス化され、1 つのデータ メンバーだけで満たされているように見えました。私は非常に混乱しています。光を当ててください?