Sobes.tech
Middle

Javaда equals ыкмасын туура кайра аныктоо кандай?

sobes.tech AI

AIден жооп

// Мисал минималдуу туура переписанный equals
class MyClass {
    private int id;
    private String name;

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

    @Override // Мажбурий белги
    public boolean equals(Object o) {
        // 1. Текшерүү идентичдүүлүк
        if (this == o) return true;
        // 2. null жана класстардын дал келүүсү
        // getClass() колдонуп катуу текшерүү
        if (o == null || getClass() != o.getClass()) return false;
        // 3. Типке түртүп алуу
        MyClass myClass = (MyClass) o;
        // 4. Маанилүү талаалардын салыштырылышы
        return id == myClass.id &&
               // Objects.equals() колдонуп объекттерди салыштыруу (null эске алынат)
               Objects.equals(name, myClass.name);
    }
}

Туура equals переписалоонун эрежелери (Object.equals контрактка ылайык):

  • Рефлексивдүүлүк: Ар бир нулдан башка x үчүн, x.equals(x) true болушу керек.
  • Симметрия: Ар бир нулдан башка x жана y үчүн, x.equals(y) true болсо, анда y.equals(x) да true болушу керек.
  • Транзитивдүүлүк: Ар бир нулдан башка x, y, жана z үчүн, эгер x.equals(y) жана y.equals(z) true болсо, анда x.equals(z) да true болушу керек.
  • Консистенттүүлүк: Көптөгөн чакыруулар x.equals(y) бирдей натыйжа бериши керек, эгер салыштыруу үчүн колдонулган маалыматтар өзгөрбөсө.
  • Ар бир нулдан башка x үчүн, x.equals(null) false болушу керек.

Коопсуз салыштыруу үчүн Objects.equals(obj1, obj2) колдонуу сунушталат, ал null-дарды туура иштетет.

equals() переписканда, hashCode() да перепискануусу керек, Object.hashCode контрактка ылайык: эгер эки объект equals() боюнча барабар болсо, алардын hashCode() бирдей болушу керек. Эскерте турган нерсе, тескерисинче талап кылынбайт. Бул эрежени сактабоо коллекциялардын туура иштебей калуусуна алып келет, мисалы HashMap, HashSet.

// MyClass үчүн туура `hashCode()` мисалы
class MyClass {
    private int id;
    private String name;

    // ... конструктор жана `equals` жогору көрсөтүлгөндөй ...

    @Override
    public int hashCode() {
        // Objects.hash() колдонуп хэшти оңой эсептөө
        return Objects.hash(id, name);
    }
}

equals жана hashCode методдорун автоматтык түрдө IDE (IntelliJ IDEA, Eclipse) аркылуу түзүүгө болот, бул жакшы практика.

instanceof колдонуу getClass() ордуна гана ылайыктуу, эгер класс мурас жыйнагынын бөлүгү болсо жана сиз жогорку жана төмөнкү класстардын объектисин бирдей деп эсептегиңиз келсе. Көп учурда, катуу текшерүү үчүн getClass() колдонуу жакшыраак.