ฉันพบปัญหาที่น่าสนใจ (และน่าผิดหวังมาก) กับ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 ชิ้นและเติมข้อมูล ดำเนินการเพิ่มลบลบมี () จำนวนมากCart
และทุกอย่างทำงานได้ดี ฉันอ่านว่าคุณสามารถมีequals(TYPE var)
หรือequals(Object o) { (CAST) var }
คิดเอาเองว่ามันทำงานได้ไม่สำคัญมาก
แล้วผมก็วิ่งเข้าไปในปัญหา - ฉันจำเป็นในการสร้าง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
วัตถุ? ความแตกต่างเพียงอย่างเดียวดูเหมือนจะเกิดจากอินสแตนซ์ของคลาสเดียวกันและเต็มไปด้วยสมาชิกข้อมูลเพียงคนเดียว ฉันสับสนมาก ได้โปรดส่องแสงบ้างไหม?