Üzerinde ==
kullanılabilir enum
mi?
Evet: numaralandırmalarda örnekleri ==
karşılaştırmak için kullanabileceğiniz sıkı örnek denetimleri bulunur . Dil şartnamesi tarafından sağlanan garanti (benim tarafımdan vurgu):
Bir enum türünün, enum sabitleri tarafından tanımlananlardan başka bir örneği yoktur.
Bir numaralandırma türünü açıkça başlatmaya çalışmak derleme zamanı hatasıdır. final clone
Yöntem Enum
sağlar enum
sabitler klonlanmış asla ve yinelenen örneklerini seriyi kaldırma sonucunda oluşturulan asla emin serileştirme mekanizması teminat altın ile özel muamele yok. Enum tiplerinin yansıtıcı örneklenmesi yasaktır. Birlikte, bu dört şey enum
, enum
sabitler tarafından tanımlanan türlerin ötesinde bir tür örneğin bulunmamasını sağlar .
Her enum
sabitin yalnızca bir örneği bulunduğundan , en az birinin bir sabiti ifade ettiği biliniyorsa, iki nesne referansını karşılaştırırken operatörün yöntem yerine kullanılmasına izin verilir==
equals
enum
. ( equals
Yöntem Enum
a, final
bu sadece çağırır yöntem super.equals
, böylece bir kimlik karşılaştırma yapmak argüman ve fayda sonucu, ilgili).
Bu garanti, Josh Bloch'un önerdiği kadar güçlüdür, eğer tekli kalıbı kullanmakta ısrar ediyorsanız, bunu uygulamanın en iyi yolu tek bir eleman kullanmaktır enum
(bakınız: Etkili Java 2. Baskı, Madde 3: Tekton özelliğini bir özel kurucu veya enum tipi ; ayrıca Singleton'da iş parçacığı güvenliği )
Arasındaki farklar nelerdir ==
ve equals
?
Bir hatırlatma olarak, genel olarak, ==
geçerli bir alternatif OLMADIĞI söylenmelidir equals
. Bununla birlikte (olduğu gibi enum
) dikkate alınacak iki önemli fark vardır:
==
asla atmaz NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==
derleme zamanında tür uyumluluk denetimine tabidir
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };
if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!
Should ==
zaman uygulanabilir kullanılacak?
Bloch özellikle, örnekleri üzerinde uygun kontrole sahip olan değişmez sınıfların, müşterilerinin ==
kullanılabilir olduğunu garanti edebileceğinden bahseder . enum
örnek olarak özellikle belirtilmiştir.
Madde 1: Yapıcılar yerine statik fabrika yöntemlerini göz önünde bulundurun
[...] değişmez bir sınıfın iki eşit örneğin bulunmadığının garantisini vermesine izin verir: a.equals(b)
eğer ve sadece a==b
. Bir sınıf bu garantiyi verirse, müşterileri yöntem ==
yerine operatörü kullanabilir ve equals(Object)
bu da performansın artmasına neden olabilir. Enum tipleri bu garantiyi sağlar.
Özetlemek gerekirse, ==
üzerinde kullanılacak argümanlar enum
şunlardır:
- İşe yarıyor.
- O daha hızlı.
- Çalışma zamanında daha güvenlidir.
- Derleme zamanında daha güvenlidir.