Hogyan írjuk fel helyesen az equals metódust Java-ban?
sobes.tech MI
Válasz az MI-től
// Példa a minimálisan helyes equals felülírására
class MyClass {
private int id;
private String name;
public MyClass(int id, String name) {
this.id = id;
this.name = name;
}
@Override // Kötelező annotáció
public boolean equals(Object o) {
// 1. Azonosítás ellenőrzése
if (this == o) return true;
// 2. null és osztályegyezőség ellenőrzése
// A getClass() használata szigorú ellenőrzéshez
if (o == null || getClass() != o.getClass()) return false;
// 3. típuskonverzió
MyClass myClass = (MyClass) o;
// 4. Jelentős mezők összehasonlítása
return id == myClass.id &&
// Az Objects.equals() használata az objektumok összehasonlításához (null figyelembe véve)
Objects.equals(name, myClass.name);
}
}
A equals helyes felülírásának szabályai (az Object.equals szerződés szerint):
- Reflexivitás: Minden nem null értékű
xesetén,x.equals(x)-nektrue-t kell adnia. - Szimmetria: Minden nem null értékű
xésyesetén,x.equals(y)akkor és csak akkortrue, hay.equals(x)istrue. - Tranzitivitás: Minden nem null értékű
x,y, észesetén, hax.equals(y)ésy.equals(z)istrue, akkorx.equals(z)istrue. - Konzisztencia: Minden nem null értékű
xésyesetén, a többszörix.equals(y)hívás ugyanazt az eredményt adja, amíg az összehasonlítandó adatok nem változnak. - Minden nem null értékű
xesetén,x.equals(null)-nakfalse-t kell adnia.
Ajánlott az Objects.equals(obj1, obj2) használata az objektumok biztonságos összehasonlításához, mivel helyesen kezeli a null értékeket.
Mindig írja felül a hashCode()-t, ha az equals()-t felülírja, az általános Object.hashCode szerződés szerint: ha két objektum egyenlő az equals(Object) módszer szerint, akkor a hashCode() által visszaadott értékük ugyanaz kell legyen. A fordított nem kötelező. Ennek a szabálynak a be nem tartása hibás kollekció működést eredményezhet, például HashMap, HashSet.
// Példa a megfelelő hashCode() implementációra a MyClass esetében
class MyClass {
private int id;
private String name;
// ... konstruktor és equals mint fent ...
@Override
public int hashCode() {
// Az Objects.hash() használata a hash kód egyszerű kiszámításához
return Objects.hash(id, name);
}
}
Az equals és hashCode metódusokat automatikusan generálhatja az IDE (IntelliJ IDEA, Eclipse), ami jó gyakorlat.
Az instanceof használata az getClass() helyett csak akkor ajánlott, ha a osztály hierarchiájának része, és azt szeretné, hogy a szuper- és alosztály példányai egyenlőnek számítsanak, ha az állapotuk megegyezik. Általában azonban a szigorúbb getClass() használata ajánlott.