Sobes.tech
Middle

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 x değeri için, x.equals(x) true döndürmelidir.
  • Simetrik: Herhangi bir null olmayan x ve y için, x.equals(y) true ise, y.equals(x) de true olmalıdır.
  • Transitiflik: Null olmayan x, y, ve z için, eğer x.equals(y) ve y.equals(z) true ise, x.equals(z) de true olmalıdır.
  • Tutarlılık: x ve y iç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 olarak true veya false döndürmelidir.
  • Herhangi bir null olmayan x için, x.equals(null) false olmalı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.