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() колдонуу жакшыраак.