Sobes.tech
Middle

Java-da equals metodunu düzgün şəkildə necə yenidən yaza bilərsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

// Ən az düzgün şəkildə yenidən tərtib edilmiş equals nümunəsi
class MyClass {
    private int id;
    private String name;

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

    @Override // Zəruri olan annotasiya
    public boolean equals(Object o) {
        // 1. İdentiklik yoxlaması
        if (this == o) return true;
        // 2. null və sinif uyğunluğu yoxlaması
        // Sərt yoxlama üçün getClass() istifadə edirik
        if (o == null || getClass() != o.getClass()) return false;
        // 3. Tipin çevrilməsi
        MyClass myClass = (MyClass) o;
        // 4. Əhəmiyyətli sahələrin müqayisəsi
        return id == myClass.id &&
               // Ob'ektləri müqayisə etmək üçün Objects.equals istifadə olunur (null-u nəzərə alır)
               Objects.equals(name, myClass.name);
    }
}

equals metodunun düzgün yenidən tərtibi üçün qaydalar (Object.equals müqaviləsinə uyğun):

  • İndəliklik: Hər hansı null olmayan x üçün, x.equals(x) true qaytarmalıdır.
  • Simmetriya: Hər hansı null olmayan xy üçün, x.equals(y) true olarsa, y.equals(x)true olmalıdır.
  • Transitivlik: Null olmayan x, y, və z üçün, əgər x.equals(y)y.equals(z) truedirsə, x.equals(z)true olmalıdır.
  • Uyumluluk: xy üçün çoxsaylı çağırışlar x.equals(y) ardıcıl olaraq true və ya false qaytarmalıdır, məlumatlar dəyişmədiyi müddətdə.
  • Null olmayan hər hansı x üçün, x.equals(null) false olmalıdır.

Ob'ektləri təhlükəsiz müqayisə etmək üçün Objects.equals(obj1, obj2) istifadə etmək tövsiyə olunur, çünki bu, null-u düzgün idarə edir.

equals() metodunu yenidən tərtib etdikdən sonra, hashCode() metodunu da yenidən tərtib etmək lazımdır, Object.hashCode müqaviləsinə uyğun olaraq: əgər iki obyekt equals() ilə bərabərdirsə, onların hashCode() dəyərləri də eyni olmalıdır. Əksinə, bu tələb edilmir. Bu qaydanı pozmaq hash-əsaslı kolleksiyaların düzgün işləməməsinə səbəb ola bilər (məsələn, HashMap, HashSet).

// MyClass üçün uyğun hashCode nümunəsi
class MyClass {
    private int id;
    private String name;

    // ... konstruktor və equals yuxarıda kimi ...

    @Override
    public int hashCode() {
        // Objects.hash istifadə edərək hash-i asanlıqla hesablayırıq
        return Objects.hash(id, name);
    }
}

equalshashCode metodlarını IDE-lər (IntelliJ IDEA, Eclipse) vasitəsilə avtomatik yaratmaq yaxşı təcrübədir.

instanceof istifadə edin, yalnız sinif irsiyyəti hissəsindədirsə və superklass və altklass obyektlərinin bərabər sayılmasını istəyirsinizsə. Əks halda, ciddi yoxlama üçün getClass() istifadə etmək daha yaxşıdır.