Java'da equals metodunu doğru şekilde nasıl geçersiz kılarsınız?
sobes.tech yapay zeka
AI'dan gelen yanıt
// En az doğru şekilde yeniden tanımlanmış equals örneği
class MyClass {
private int id;
private String name;
public MyClass(int id, String name) {
this.id = id;
this.name = name;
}
@Override // Zorunlu anotasyon
public boolean equals(Object o) {
// 1. Kimlik kontrolü
if (this == o) return true;
// 2. null ve sınıf uyumluluğu kontrolü
// Sıkı bir kontrol için getClass() kullanılır
if (o == null || getClass() != o.getClass()) return false;
// 3. Tür dönüşümü
MyClass myClass = (MyClass) o;
// 4. Anlamlı alanların karşılaştırılması
return id == myClass.id &&
// Nesneleri karşılaştırmak için Objects.equals kullanılır (null dikkate alınır)
Objects.equals(name, myClass.name);
}
}
equals metodunun doğru şekilde yeniden tanımlanması kuralları (Object.equals sözleşmesine uygun):
- Yansızlık: Herhangi bir null olmayan
xdeğeri için,x.equals(x)truedöndürmelidir. - Simetrik: Herhangi bir null olmayan
xveyiçin,x.equals(y)trueise,y.equals(x)detrueolmalıdır. - Transitiflik: Null olmayan
x,y, veziçin, eğerx.equals(y)vey.equals(z)trueise,x.equals(z)detrueolmalıdır. - Tutarlılık:
xveyiçin,x.equals(y)çok kez çağrıldığında, nesnelerin karşılaştırılmasında kullanılan bilgiler değişmediği sürece, sürekli olaraktrueveyafalsedöndürmelidir. - Herhangi bir null olmayan
xiçin,x.equals(null)falseolmalıdır.
Nesneleri güvenli karşılaştırmak için Objects.equals(obj1, obj2) kullanmanız önerilir, çünkü null durumlarını düzgün şekilde işler.
equals() metodunu yeniden tanımladıktan sonra, hashCode() metodunu da yeniden tanımlamak gerekir, Object.hashCode sözleşmesine uygun olarak: Eğer iki nesne equals() ile eşitse, hashCode() değerleri de aynı olmalıdır. Tersine bu gerekmez. Bu kurala uyulmaması, hash tabanlı koleksiyonların (örneğin, HashMap, HashSet) düzgün çalışmamasına neden olur.
// MyClass için uygun hashCode örneği
class MyClass {
private int id;
private String name;
// ... yapıcı ve equals yukarıdaki gibi ...
@Override
public int hashCode() {
// Objects.hash kullanarak hash hesaplamayı kolaylaştırır
return Objects.hash(id, name);
}
}
equals ve hashCode metodlarını IDE'ler (IntelliJ IDEA, Eclipse) kullanarak otomatik oluşturmak iyi bir uygulamadır.
instanceof kullanımı, sınıf hiyerarşisinin bir parçasıysa ve nesnelerin aynı duruma sahip olup olmadığını kontrol etmek istiyorsanız, getClass() yerine kullanılabilir. Çoğu durumda, katı bir kontrol için getClass() kullanmak tercih edilir.