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)trueqaytarmalıdır. - Simmetriya: Hər hansı null olmayan
xvəyüçün,x.equals(y)trueolarsa,y.equals(x)dətrueolmalıdır. - Transitivlik: Null olmayan
x,y, vəzüçün, əgərx.equals(y)vəy.equals(z)truedirsə,x.equals(z)dətrueolmalıdır. - Uyumluluk:
xvəyüçün çoxsaylı çağırışlarx.equals(y)ardıcıl olaraqtruevə yafalseqaytarmalıdır, məlumatlar dəyişmədiyi müddətdə. - Null olmayan hər hansı
xüçün,x.equals(null)falseolmalı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);
}
}
equals və hashCode 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.