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