2010-11-26 17 views
5

Bazen, kod yazdığınız ortamın birden fazla sınıf yükleyiciye sahip olduğunu bile bilmeyebilirsiniz. Bu durumda "==" işleminin enum değerleri üzerinde çalışmasını bekleyebilir miyim?enum vs. sınıf yüklemeleri

cevap

-5

"==" çalışmaz, ama yine de .equals() kullanmak istiyorum.

Sen apache commons lang sınıfında ilginizi çekebilir: link text

+1

Asıl soru - eşittir() 'çalışır mı? –

+1

BTW, Enum 'equals() işlevinin uygulanması sadece' this == other' (Sun/Oracle JDK 6) 'ı çağırır. –

+0

yup, kendi cevabımda yazdığım gibi –

11

Çoklu classloaders sürece enum bunlardan biri ile kullanılabilir olduğu gibi sorun olmayabilir. Bu durumda değilse, bir enum'un tüm faydalarını kaybedersiniz. ya da yardımcı olmuyor equals() kullanılarak

Ve bu arada

. senin enum sınıfı sadece bir kez yüklenirse

public final boolean equals(Object other) { 
    return this==other; 
} 
+0

Burada josefx'in yazdığı gibi aynı şey; Bir enum birden fazla sınıf yükleyici tarafından yüklendiğinde çalışmaya devam edebilir, sadece birbirlerinden izole edilmelerine dikkat etmelisiniz. –

+0

Elbette, ama bu bir acı. Biri enumlarla ilgili olan herhangi bir varsayımı kırar. Ve enton tekil desenini kırar. –

+5

Sınıf yükleyiciler tüm tekil kalıplarını kırıyor. – josefx

8

hala çalışır: Burada Java 1,6 Enum.equals(Object) uygulanması bulunuyor.

    sizin enum sadece yüklenen eklenti içinde kullanıldığında
  • enum bireysel eklenti classloaders bir ebeveyn classloader tarafından yüklenmiş sizin enum sınıfı farklı classloaders tarafından yüklenirse

o çalışmaz

  • Farklı eklentiler arasında enum değerlerini geçersiniz, ancak uygulama ssloader enum'u yüklemedi. (Enum değerleri eklentileri arasında çapraz asla eğer hala çalışabilir)

o

Java farklı enum değerleri temsil etmek nesne örneklerini kullanan, bu örnekler her saklanır bu yolu olmasının sebebi enum sınıfı içinde statik bir alan olarak. Enum iki kere yüklenirse, her enum değeri iki farklı nesne örneği tarafından temsil edilir. == operator yalnızca referansları karşılaştırır ve bir enum değerini temsil eden çoklu örneklerden habersizdir, bu nedenle farklı sınıf yükleyicileri tarafından yüklenen değerler eşleşmez.

+0

"== operatör sadece referansları karşılaştırır" bir dogma gibi ses çıkarır. Enum zaten çok özel bir şey. Bir uzmanlık alanı, "==" yi "this.ordinal() == this.ordinal()" olarak tanımlayabilir. Bu sorunu çözebilir mi? – Dima

+0

@Dima enum'un her iki yüklü tanımları aynı olduğu sürece çalışacaktır. Sıra değeri sadece kod değiştiğinde (yeni değerler, farklı sıralamalar) kaynak kodda Enum sabitinin dizinini (konumunu) içerir. Hız bir sorun değilse, isimlerini karşılaştırabilirsiniz. – josefx