Ya, ini seolah-olah Anda telah membuat instance tunggal untuk setiap nilai dalam enum:
public abstract class RoundingMode {
public static final RoundingMode HALF_UP = new RoundingMode ();
public static final RoundingMode HALF_EVEN = new RoundingMode ();
private RoundingMode () {
// private scope mencegah subtipe apapun di luar kelas ini
}
}
Namun , enum
konstruksinya memberi Anda berbagai manfaat:
- Tiap instance toString () mencetak nama yang diberikan dalam kode.
- (Seperti yang disebutkan di posting lain,) variabel tipe enum dapat dibandingkan dengan konstanta menggunakan
switch-case
struktur kontrol.
- Semua nilai dalam enumerasi dapat ditanyakan menggunakan kolom
values
yang 'dihasilkan' untuk setiap jenis enumerasi
- Inilah perbandingan besar identitas wrt: nilai enum bertahan serialisasi tanpa kloning.
Serialisasi adalah masalah besar. Jika saya menggunakan kode di atas dan bukan enum, berikut ini bagaimana persamaan identitas akan berperilaku:
RoundingMode original = RoundingMode.HALF_UP;
menegaskan (RoundingMode.HALF_UP == asli); // lulus
ByteArrayOutputStream baos = ByteArrayOutputStream () baru;
ObjectOutputStream oos = baru ObjectOutputStream (baos);
oos.writeObject (asli);
oos.flush ();
ByteArrayInputStream bais = ByteArrayInputStream baru (baos.toByteArray ());
ObjectInputStream ois = baru ObjectInputStream (bais);
RoundingMode deserialized = (RoundingMode) ois.readObject ();
menegaskan (RoundingMode.HALF_UP == deserialized); // gagal
menegaskan (RoundingMode.HALF_EVEN == deserialized); // gagal
Anda dapat mengatasi masalah ini tanpa enum, menggunakan teknik yang melibatkan writeReplace
dan readResolve
, (lihat http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...
Saya kira intinya adalah - Java berusaha keras untuk memungkinkan Anda menggunakan identitas enum values untuk menguji kesetaraan; itu adalah praktik yang didorong.