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 ArrayListdari Bookobjek . Dalam rangka mengimplementasikan addBook(), removeBook()dan hasBook()metode Cart, saya ingin memeriksa apakah Booksudah 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 Cartdan 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 Bookobjek dengan hanya satu IDdi 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 Cartkelas 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 Bookobjek? 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?