Java-ში equals() მეთოდი რა აკეთებს?
sobes.tech AI
პასუხი AI-სგან
Java-да equals() მეთოდი გამოიყენება ორი ობიექტის თანასწორობის შესამოწმებლად. დეფოლტად, როდესაც ობიექტები მემკვიდრეობას იღებენ Object-დან და მისი გადაწერით არ არის, ის შედარებას ახდენს ობიექტების მითითებებს (==), ანუ ამოწმებს, არის თუ არა ცვლადები ერთსა და იმავე მეხსიერების უბანში.
equals() მეთოდის სწორად გადაწერილობა მნიშვნელოვანია ობიექტების შედარებისთვის მათი შიგთავსის მიხედვით, არა მათი მეხსიერებაში მდებარეობის მიხედვით.
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დაyარაა ნულოვანი ობიექტებისთვის, მრავალჯერადი ზარებიx.equals(y)უნდა აბრუნებდეს ერთსა და იმავე შედეგს, თუ ორივე ობიექტში გამოყენებული ინფორმაცია არ შეცვლილა. - null-ის მიმართ უუნარობა: ნებისმიერი
xარაა ნულოვანი ობიექტისთვის,x.equals(null)უნდა აბრუნებდესfalse.
საშუალოდ, equals()-ის გადაწერილობისას, საჭიროა ასევე გადაწეროთ hashCode() მეთოდი, რომელიც უნდა შეესაბამებოდეს კონტრაქტს: თუ ორი ობიექტი თანასწორია equals()-ის მიხედვით, მათი hashCode()-ები უნდა იყოს ერთნაირი. საპირისპირო არ არის აუცილებელი: თუ ჰეშკოდები ერთნაირია, ობიექტები შესაძლოა არ იყოს თანასწორი.
მაგალითი გადაწერილი:
public class MyObject {
private int value;
private String name;
public MyObject(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// შედარება
if (this == o) return true;
// null-ის და კლასი-ის შემოწმება
if (o == null || getClass() != o.getClass()) return false;
// ტიპის გადაყვანა და ფილდერების შედარება
MyObject myObject = (MyObject) o;
return value == myObject.value &&
Objects.equals(name, myObject.name);
}
@Override
public int hashCode() {
// ჰეშკოდის გენერირება ფილდერების საფუძველზე
return Objects.hash(value, name);
}
// გეტერები, სეტერები და ა.შ.
}