Tôi đã gặp phải một vấn đề thú vị (và rất bực bội) với equals()
phương pháp ngày hôm nay, điều khiến cho thứ mà tôi nghĩ là một lớp được kiểm tra tốt bị sập và gây ra một lỗi khiến tôi mất nhiều thời gian để theo dõi.
Để hoàn thiện, tôi đã không sử dụng IDE hoặc trình gỡ lỗi - chỉ là trình soạn thảo văn bản lỗi thời và System.out. Thời gian rất hạn chế và đó là một dự án trường học.
Dù sao đi nữa -
Tôi đã phát triển một giỏ mua hàng cơ bản mà có thể chứa một ArrayList
số Book
đối tượng . Để thực hiện addBook()
, removeBook()
và hasBook()
phương pháp của giỏ hàng, tôi muốn kiểm tra xem Book
đã tồn tại trong Cart
. Vì vậy, tôi đi -
public boolean equals(Book b) {
... // More code here - null checks
if (b.getID() == this.getID()) return true;
else return false;
}
Tất cả đều hoạt động tốt trong thử nghiệm. Tôi tạo 6 đối tượng và điền chúng với dữ liệu. Thực hiện nhiều thao tác thêm, xóa, có () trên Cart
và mọi thứ đều hoạt động tốt. Tôi đọc rằng bạn có thể có equals(TYPE var)
hoặcequals(Object o) { (CAST) var }
nhưng cho rằng vì nó đang hoạt động nên nó không quá quan trọng.
Sau đó, tôi chạy vào một vấn đề - Tôi cần thiết để tạo ra một Book
đối tượng với chỉ những ID
ở trong đó từ bên trong lớp Book. Không có dữ liệu khác sẽ được nhập vào nó. Về cơ bản như sau:
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);
}
Đột nhiên, equals(Book b)
phương pháp không còn hoạt động. Điều này đã mất một thời gian RẤT lâu để theo dõi mà không có trình sửa lỗi tốt và giả sử rằng Cart
lớp đã được kiểm tra và sửa chữa đúng. Sau khi hoán đổi equals()
phương thức như sau:
public boolean equals(Object o) {
Book b = (Book) o;
... // The rest goes here
}
Mọi thứ bắt đầu hoạt động trở lại. Có lý do nào để phương thức quyết định không lấy tham số Sách mặc dù rõ ràng nó là một Book
đối tượng? Sự khác biệt duy nhất dường như là nó được khởi tạo từ trong cùng một lớp và chỉ chứa đầy một thành viên dữ liệu. Tôi rất rất bối rối. Xin vui lòng, làm sáng tỏ một số?