Sobes.tech
Junior

Čo robí metóda equals() v Jave?

sobes.tech AI

Odpoveď od AI

Metóda equals() v Jave sa používa na porovnanie dvoch objektov na rovnosť. Vo výchozom nastavení, v prípade objektov, ktoré dedičia od Object bez jeho prepísania, porovnáva referencie na objekty (==), teda kontroluje, či premenné ukazujú na rovnaké miesto v pamäti.

Správne prepísanie metódy equals() je dôležité na porovnávanie objektov podľa ich obsahu, nie podľa ich umiestnenia v pamäti.

Pri prepísaní equals(), je potrebné dodržiavať nasledujúce pravidlá:

  • Reflexivita: pre akýkoľvek nenulový objekt x, x.equals(x) by malo vracať true.
  • Symetria: pre akékoľvek nenulové objekty x a y, ak x.equals(y) vracia true, tak aj y.equals(x) by malo vracať true.
  • Tranzitivita: pre akékoľvek nenulové objekty x, y a z, ak x.equals(y) vracia true a y.equals(z) vracia true, tak aj x.equals(z) by malo vracať true.
  • Konzistentnosť: pre akékoľvek nenulové objekty x a y, opakované volania x.equals(y) by mali konzistentne vracať rovnaký výsledok, za predpokladu, že informácie použité na porovnanie v oboch objektoch sa nezmenili medzi volaniami.
  • Pre akýkoľvek nenulový objekt x, x.equals(null) by malo vracať false.

Zvyčajne, pri prepísaní equals(), je tiež potrebné prepísať metódu hashCode(), dodržiavajúc kontrakt: ak sú dva objekty rovnaké podľa equals(), ich hash-kódy, získané metódou hashCode(), by mali byť rovnaké. Opak nie je povinný: ak sú hash-kódy rovnaké, objekty nemusia byť nevyhnutne rovnaké.

Príklad prepísania:

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) {
        // Porovnanie
        if (this == o) return true;
        // Kontrola na null a typ objektu
        if (o == null || getClass() != o.getClass()) return false;
        // Prevod typu a porovnanie podľa polí
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Generovanie hash-kódu na základe polí
        return Objects.hash(value, name);
    }

    // gettery, settery a pod.
}