SORU
27 ŞUBAT 2009, Cuma


GetClass tercih herhangi bir nedenle() oluştururken örneğin .() eşittir?

Eclipse .equals() .hashCode(), üretmek için kullanıyorum ve etiketli bir seçenek var "'' türleri karşılaştırmak için". örneğin Kullanın Varsayılan bu seçenek işaretli olmalı ve .getClass() türleri karşılaştırmak için. instanceof .getClass() tercih etmeliyim herhangi bir nedeni var mı?

instanceof kullanmadan:

if (obj == null)
  return false;
if (getClass() != obj.getClass())
  return false;

instanceof kullanarak:

if (obj == null)
  return false;
if (!(obj instanceof MyClass))
  return false;

Ben genelde instanceof seçeneğini işaretleyin, sonra da "if (obj == null)" kontrol edin. sonra Kaldır (Boş nesneler her zaman*.* 13) başarısız olacağından gereksiz olur Kötü bir fikir olması için bir sebep var mı?

CEVAP
27 ŞUBAT 2009, Cuma


Josh Bloch yaklaşım iyilik:

Nedeni sevdiğim instanceof yaklaşım olduğunu kullandığınızda getClass yaklaşım var kısıtlaması olan nesneler, sadece eşit diğer nesnelerin aynı sınıf, aynı çalışma zamanı tür. Eğer genişletmek için bir sınıf ekleyin ve birkaç zararsız yöntemleri, kontrol olup olmadığını görmek için bazı nesnesinin alt sınıfı eşit bir nesnenin süper sınıf, bile, nesneleri eşit olarak tüm önemli yönleriyle, sen-ecek almak şaşırtıcı cevap bu değil mi eşit. Aslında bu, katı bir yorumunu ihlal ediyorİkame prensibi Liskovve çok şaşırtıcı bir davranış yol açabilir. Java, koleksiyonları en (HashTable, vb.) çünkü bu özellikle önemlidir. temel alan yöntem eşittir. Anahtar olarak karma tablo süper sınıfının bir üyesi koyup bir alt sınıf örneği kullanarak, eşit değildir, çünkü bulamazsınız.

Ayrıca this SO answer bkz.

chapter 3 etkili Java da bunu kapsar.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ICON

    ICON

    19 EKİM 2011
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013
  • williamfitzsimmons

    williamfitzs

    14 Mart 2008