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

  • infodirt

    infodirt

    11 Mart 2009
  • jagadambarecords

    jagadambarec

    13 AĞUSTOS 2008
  • NYCarspotter

    NYCarspotter

    26 EYLÜL 2011