SORU
9 EKİM 2008, PERŞEMBE


Java geçersiz kılma equals() metodu cilvesi

Karşılaştım ilginç (ve çok sinir bozucu) konu ile equals() metodu bugün neyin sebep olduğunu düşündüğüm için bir test sınıfı çökmesine neden bir hata aldı bana çok uzun zaman izini.

Sadece bütünlüğü için, IDE veya hata ayıklayıcısı - sadece eski moda bir metin editörü ve bir Sistemi kullanmıyordum.çıktı. Zaman çok kısıtlı ve bir okul projesi oldu.

Nasıl olsa -

Kitap bir nesne ArrayList içeren temel bir alışveriş sepeti bastım. Bu addBook uygulamak için, removeBook(), ve hasBook() Sepeti yöntemleri, Kitabı zaten arabası var olup olmadığını kontrol etmek istedim. Sen de git bakalım

public boolean equals(Book b) {
    ... // More code here - null checks
    if (b.getID() == this.getID()) return true;
    else return false;
}

Tüm test gayet iyi çalışıyor. 6 nesneleri oluşturmak ve veri ile doldurmak. Birçok ekler, kaldırır, () Arabası ve her şey üzerinde işlemler gayet iyi çalışıyor. Ya da eşittir(TÜRÜ var) veya eşittir(Object o) { (OYUNCULAR) var } var diye okudum ama iş bu yana, çok fazla bir önemi olmadığını düşündü.

O zaman bir problem Kitabı sınıf içinde tek İD ile Kitap bir nesne oluşturmak için gerekli karşılaştım. Başka bir veri içine girmiş olur. Temelde aşağıdaki gibidir:

public boolean hasBook(int i) {
    Book b = new Book(i);
    return hasBook(b);
}

public boolean hasBook(Book b) {
    // .. more code here
    return this.books.contains(b);
}

Birdenbire, (Kitap b) yöntem artık çalışmıyor demektir. Bu ÇOK uzun bir zaman iyi bir hata ayıklayıcı olmadan izini bulmak için Arabası ve sınıfının doğru düzgün Test ve doğru olduğunu varsayarak aldı. Equals swaapping sonra aşağıdaki yöntemi:

public boolean equals(Object o) {
    Book b = (Book) o;
    ... // The rest goes here   
}

Her şey yeniden çalışmaya başladı. Yöntemi Kitap parametre olsa da almamaya karar bir nedeni açıkça varolduKitap bir nesne? Tek fark aynı sınıf içinde başlatılan ve tek bir veri üyesi ile dolu gibi görünüyordu. Kafam çok karışık çok. Lütfen, biraz ışık tutmak?

CEVAP
9 EKİM 2008, PERŞEMBE


Java, Object devralınmış equals() yöntemi:

public boolean equals(Object other);

Diğer bir deyişle, parametre 11 ** türünden olmalıdır.

ArrayList her zaman düzgün Objectgeçersiz etmeyen arayıp nerede olduğunu doğru equals yöntemi, eşit olarak kullanır.

Bu yöntem geçersiz kılma doğru değil sorunlara neden olabilir.

Çıkıyorum her seferinde aşağıdaki eşittir:

@Override
public boolean equals(Object other){
    if (other == null) return false;
    if (other == this) return true;
    if (!(other instanceof MyClass))return false;
    MyClass otherMyClass = (MyClass)other;
    ...test other properties here...
}

@Override annotation kullanımı aptalca hatalar ile bir ton yardımcı olabilir.

Süper bir sınıf veya arabirim yöntemi. öncelikli düşündüğünüz zaman kullanın Eğer yanlış yaparsanız bu şekilde, bir derleme hatası alırsınız.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • engineerguy

    engineerguy

    10 Ocak 2010
  • TokShogun

    TokShogun

    6 HAZİRAN 2009