Saya mengalami masalah yang menarik (dan sangat membuat frustrasi) dengan equals()
metode hari ini yang menyebabkan apa yang saya pikir sebagai kelas yang teruji rusak dan menyebabkan bug yang membutuhkan waktu sangat lama untuk dilacak.
Hanya untuk kelengkapan, saya tidak menggunakan IDE atau debugger - hanya editor teks kuno dan System.out yang bagus. Waktu sangat terbatas dan itu adalah proyek sekolah.
Bagaimanapun -
Saya sedang mengembangkan keranjang belanja dasar yang bisa mengandung ArrayList
dari Book
objek . Dalam rangka mengimplementasikan addBook()
, removeBook()
dan hasBook()
metode Cart, saya ingin memeriksa apakah Book
sudah ada di Cart
. Jadi saya pergi -
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
Semua berfungsi dengan baik dalam pengujian. Saya membuat 6 objek dan mengisinya dengan data. Apakah banyak menambahkan, menghapus, memiliki () operasi di Cart
dan semuanya berfungsi dengan baik. Saya membaca bahwa Anda dapat memiliki equals(TYPE var)
atauequals(Object o) { (CAST) var }
tetapi berasumsi bahwa karena itu berfungsi, itu tidak terlalu penting.
Lalu aku berlari ke masalah - saya butuhkan untuk membuat Book
objek dengan hanya satu ID
di dalamnya dari dalam kelas Book. Tidak ada data lain yang akan dimasukkan ke dalamnya. Pada dasarnya sebagai berikut:
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);
}
Tiba-tiba, equals(Book b)
metode ini tidak lagi berfungsi. Ini membutuhkan waktu yang SANGAT lama untuk dilacak tanpa debugger yang bagus dan menganggap Cart
kelas telah diuji dengan benar dan benar. Setelah menunggu equals()
metode sebagai berikut:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
Segalanya mulai bekerja lagi. Apakah ada alasan metode memutuskan untuk tidak mengambil parameter Book meskipun itu jelas adalah sebuah Book
objek? Satu-satunya perbedaan tampaknya adalah itu dipakai dari dalam kelas yang sama, dan hanya diisi dengan satu anggota data. Saya sangat sangat bingung. Tolong, beri sedikit cahaya?