Sobes.tech
Middle

Jaká jsou pravidla pro metody equals a hashCode?

sobes.tech AI

Odpověď od AI

  1. Pokud jsou dva objekty shodné podle metody equals(Object), jejich hash kódy (vrácené metodou hashCode()) by měly být stejné.
  2. Pokud dva objekty nejsou shodné podle metody equals(Object), jejich hash kódy mohou být stejné nebo odlišné. Dobrou praxí je zajistit odlišné hash kódy pro nerovné objekty pro lepší výkon kolekcí založených na hashování.
  3. Metoda hashCode() by měla vracet stejné hodnoty pro tentýž objekt při více voláních, pokud se žádná informace používaná pro výpočet hash nezměnila.
  4. Symetrie: pro jakékoli objekty a a b, pokud a.equals(b) je true, pak b.equals(a) by mělo být také true.
  5. Reflexivita: pro jakýkoli nenulový objekt a, a.equals(a) by mělo být true.
  6. Transitivita: pro jakékoli objekty a, b a c, pokud a.equals(b) je true a b.equals(c) je true, pak a.equals(c) by mělo být také true.
  7. Konzistence: pro jakékoli nenulové objekty a a b, opakované volání a.equals(b) by mělo konzistentně vracet true nebo false, pokud se informace používané v equals(Object) nezměnily.

Příklad implementace:

public class MyClass {

    private int value;
    private String name;

    public MyClass(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // Kontrola identity objektů
        if (this == o) {
            return true;
        }
        // Kontrola typu objektu
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // Přetypování
        MyClass myClass = (MyClass) o;
        // Porovnání podle polí
        return value == myClass.value &&
               Objects.equals(name, myClass.name); // Použití Objects.equals pro null
    }

    @Override
    public int hashCode() {
        // Použití Objects.hash
        return Objects.hash(value, name);
    }

    // Další metody...
}