Sobes.tech
Middle

Қоидаҳои барои усулҳои equals ва hashCode чист?

sobes.tech AI

Ҷавоб аз AI

  1. Калі два аб'екты роўныя па метадзе equals(Object), то іх хэш-коды (якія вяртае метад hashCode()) павінны быць аднолькавымі.
  2. Калі два аб'екты не роўныя па метадзе equals(Object), то іх хэш-коды можа быць як аднолькавымі, так і рознымі. Добрая практыка — забяспечыць розныя хэш-коды для нераўных аб'ектаў для лепшай прадукцыйнасці калекцый, заснаваных на хэшах.
  3. Метад hashCode() павінен вяртаць аднолькавыя значэнні для аднаго і таго ж аб'екта пры шматразовых выкліках, калі ніякая інфармацыя, якая выкарыстоўваецца для вылічэння хэш-кода, не змянілася.
  4. Сімметрычнасць: для любых аб'ектаў a і b, калі a.equals(b) раўна true, то b.equals(a) таксама павінна быць true.
  5. Рэфлексіўнасць: для любога ненулявога аб'екта a, a.equals(a) павінна быць true.
  6. Транзітыўнасць: для любых аб'ектаў a, b і c, калі a.equals(b) раўна true і b.equals(c) раўна true, то a.equals(c) таксама павінна быць true.
  7. Супадзенне: для любых ненулявых аб'ектаў a і b, шматразовыя выклікі a.equals(b) павінны паслядоўна вяртаць true або false, пры ўмове, што інфармацыя, якая выкарыстоўваецца ў параўнаннях equals(Object), не змянілася.

Прыклад рэалізацыі:

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) {
        // Праверка ідэнтычнасці аб'ектаў
        if (this == o) {
            return true;
        }
        // Праверка тыпу аб'екта
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // Прыводзім да патрэбнага тыпу
        MyClass myClass = (MyClass) o;
        // Параўнанне па палях
        return value == myClass.value &&
               Objects.equals(name, myClass.name); // Выкарыстоўваем Objects.equals для апрацоўкі null
    }

    @Override
    public int hashCode() {
        // Выкарыстанне Objects.hash для генерацыі хэш-кода на аснове палёў
        return Objects.hash(value, name);
    }

    // Іншыя метады...
}