Evet, numaralandırmadaki her değer için tekli örnekler oluşturmuşsunuz gibi:
public abstract class RoundingMode {
public statik final RoundingMode HALF_UP = new RoundingMode ();
public statik final RoundingMode HALF_EVEN = new RoundingMode ();
özel RoundingMode () {
// özel kapsam, bu sınıfın dışındaki tüm alt türleri engeller
}
}
Bununla birlikte , enum
yapı size çeşitli faydalar sağlar:
- Her örneğin toString () kodu kodda verilen adı yazdırır.
- (Başka bir gönderide bahsedildiği gibi), enum türündeki bir değişken,
switch-case
kontrol yapısı kullanılarak sabitlerle karşılaştırılabilir .
- Numaralandırmadaki tüm değerler,
values
her bir numaralandırma türü için 'oluşturulan' alan kullanılarak sorgulanabilir
- İşte kimlik karşılaştırmalarının en büyüğü: enum değerleri, klonlama olmadan serileştirmeden kurtulur.
Serileştirme büyük bir saçmalık. Bir sıralama yerine yukarıdaki kodu kullanacak olsaydım, kimlik eşitliği şu şekilde davranırdı:
RoundingMode original = RoundingMode.HALF_UP;
assert (RoundingMode.HALF_UP == orijinal); // geçer
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ObjectOutputStream oos = new ObjectOutputStream (baos);
oos.writeObject (orijinal);
) (Oos.flush;
ByteArrayInputStream bais = new ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = new ObjectInputStream (bais);
RoundingMode serisizleştirildi = (RoundingMode) ois.readObject ();
assert (RoundingMode.HALF_UP == serileştirilmemiş); // başarısız
assert (RoundingMode.HALF_EVEN == serileştirilmemiş); // başarısız
Sen edebilirsiniz içeren bir teknik kullanılarak, enum olmadan bu sorunu gidermek writeReplace
ve readResolve
(bkz http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...
Sanırım asıl mesele şu - Java eşitliği test etmek için enum değerlerinin kimliklerini kullanmanıza izin verme yolundan çıkıyor; teşvik edilen bir uygulamadır.