Sobes.tech
Junior

Co dělá metoda equals() v Java?

sobes.tech AI

Odpověď od AI

Metoda equals() v jazyce Java se používá k porovnání dvou objektů na rovnost. Ve výchozím nastavení, u objektů, které dědí od Object bez přepsání, porovnává reference na objekty (==), tedy kontroluje, zda proměnné ukazují na stejnou oblast paměti.

Správné přepsání metody equals() je důležité pro porovnání objektů podle jejich obsahu, nikoli podle jejich umístění v paměti.

Při přepisování equals() je třeba dodržovat následující pravidla:

  • Reflexivita: pro jakýkoli nenulový objekt x by x.equals(x) mělo vracet true.
  • Symetrie: pro jakékoli nenulové objekty x a y, pokud x.equals(y) vrací true, pak i y.equals(x) by mělo vracet true.
  • Transitivita: pro jakékoli nenulové objekty x, y a z, pokud x.equals(y) a y.equals(z) vrací true, pak i x.equals(z) by mělo vracet true.
  • Konzistence: pro jakékoli nenulové objekty x a y, opakované volání x.equals(y) by mělo konzistentně vracet stejný výsledek, pokud se informace používané pro porovnání nezmění.
  • Pro jakýkoli nenulový objekt x by x.equals(null) mělo vracet false.

Obvykle, při přepisování equals(), je třeba také přepsat metodu hashCode(), přičemž je nutné dodržovat kontrakt: pokud jsou dva objekty podle equals() rovné, jejich hash kódy, vrácené metodou hashCode(), musí být stejné. Opak není povinný: pokud jsou hash kódy stejné, objekty nemusí být nutně rovné.

Příklad přepsání:

public class MyObject {
    private int value;
    private String name;

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

    @Override
    public boolean equals(Object o) {
        // Samotné porovnání
        if (this == o) return true;
        // Kontrola na null a typ objektu
        if (o == null || getClass() != o.getClass()) return false;
        // Přetypování a porovnání podle polí
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Generování hash kódu na základě polí
        return Objects.hash(value, name);
    }

    // gettery, settery atd.
}