23/7/58

ข้อระวังในการใช้ java equals ใน Class ต่าง ๆ เช่น Long Integer

ข้อระวังในการใช้ java equals ใน Class ต่าง ๆ เช่น Long Integer

วันนี้มีอยู่เคสหนึ่งคับ เป็นเคสที่ต้องเทียบค่า โดยมีสองค่าคือ Long กับ Integer ตอนแรกกะจะใช้ equals ใน Java ตัวอย่างเช่น 

Long.valueOf(0).equals(Integer.valueOf(0)) แต่ค่าที่ได้กลับเป็น false เรามาดูกันว่าทำไม

เราไปดูใน Long.java ใน method equals กันซึ่งจะเป็นดังนี้

public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

จากโค้ดจะเห็นว่า method equals นั้นจะรับ Object เข้ามา แต่เมื่อรับเข้ามาแล้วมันก็มาตรวจสอบอยู่ดีว่าเป็น Long หรือเปล่า ถ้าเป็น Long ถึงจะเทียบค่าให้ แต่ถ้าไม่ใช่มันก็จะ return false ทันที

จากกรณีข้างบนเราใช้ Long equals จากนั้นก็ส่ง Integer เข้ามาถึงแม้ว่าจะเป็นค่าเดียวกัน แต่ว่าในเมทอด equals มันจะไปตรวจสอบว่าเป็นชนิด Long หรือเปล่าซึ่งกรณีนี้จะไม่ใช่เพราะเป็น Integer ดังนั้นมันจะ return false ทันที

เกือบพลาดแล้วไหมล่ะ อิอิ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น