SORU
15 ŞUBAT 2010, PAZARTESİ


Neden Java equals ve hashCode yöntemleri geçersiz kılmak gerekir mi?

Son zamanlarda bu okudum Developer Works Document. Belge etkin ve doğru hashCode() equals() tanımlama ile ilgilidir ama bu iki yöntem geçersiz kılmak için neden gerekli olduğunu anlamaya muktedir değilim.

Nasıl bu yöntem etkin bir şekilde uygulamaya karar verebilir miyim?

CEVAP
15 ŞUBAT 2010, PAZARTESİ


Her zaman gerekli hashcode ve equals geçersiz kılmak değildir. Ama eğer bir geçersiz kılmak gerekir düşünüyorsanız, o zaman her ikisi de geçersiz kılmak gerekir. Hadi biz bir geçersiz kılma ama diğer durum olurdu. ne analiz ve Map kullanmak için çalışıyoruz.

Böyle bir sınıf var ve MyClass iki nesne importantField eşittir kendi halinde eşit hashCode equals eclipse tarafından oluşturulan () olduğunu söylüyor

public class MyClass {

    private final String importantField;
    private final String anotherField;

    public MyClass(final String equalField, final String anotherField) {
        this.importantField = equalField;
        this.anotherField = anotherField;
    }

    public String getEqualField() {
        return importantField;
    }

    public String getAnotherField() {
        return anotherField;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                  ((importantField == null) ? 0 : importantField.hashCode());
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final MyClass other = (MyClass) obj;
        if (importantField == null) {
            if (other.importantField != null)
                return false;
        } else if (!importantField.equals(other.importantField))
            return false;
        return true;
    }

}

Sadece hashCode geçersiz kılar

Bu var düşünün

MyClass first = new MyClass("a","first");
MyClass second = new MyClass("a","second");

Sadece myMap.put(first,someValue) çağırdığınızda hashCode sonra geçersiz kılma ilk alır, hesaplar belirli bir kova hashCode ve depolar. Sonra myMap.put(second,someOtherValue) çağırdığınızda eşit (bizim tanımımıza göre) çünkü Map Documentation başı olarak ikinci ile ilk değiştirmelisiniz.

Ama sorun şu ki eşit değildi yeniden, o zaman göster karma second ve yineler kova isteyen varsa bir nesne k second.equals(k) doğru olmayacaktır bulacaksınız herhangi second.equals(first) false.

Sadece equals geçersiz kılar

Eğer sadece equals geçersiz, o zaman sana haber myMap.put(first,someValue) ilk olacak karma için bazı kova ve arama myMap.put(second,someOtherValue) olacak karma için başka bir kova (da farklı bir hashCode). Aynı kova karma yok gibi eşit oldukları halde,,, harita ve ikisi de göster kalmak fark edemez.

Açıktı umuyoruz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • B3ASTTY™

    B3ASTTY™

    27 Mayıs 2013
  • Facebook Developers

    Facebook Dev

    24 ŞUBAT 2009
  • Sergio Fernandez

    Sergio Ferna

    1 EKİM 2009