ใช่ราวกับว่าคุณได้สร้างอินสแตนซ์ซิงเกิลตันสำหรับแต่ละค่าใน enum:
คลาสนามธรรมสาธารณะ RoundingMode {
RoundingMode สุดท้ายแบบคงที่สาธารณะ HALF_UP = RoundingMode ใหม่ ();
RoundingMode สุดท้ายแบบคงที่สาธารณะ HALF_EVEN = RoundingMode ใหม่ ();
RoundingMode ส่วนตัว () {
// ขอบเขตส่วนตัวป้องกันประเภทย่อยใด ๆ ที่อยู่นอกคลาสนี้
}
}
แต่ที่enum
สร้างให้คุณประโยชน์ต่างๆ:
- toString () ของแต่ละอินสแตนซ์จะพิมพ์ชื่อที่ระบุในโค้ด
- (ดังที่กล่าวไว้ในโพสต์อื่น) ตัวแปรชนิด enum สามารถเปรียบเทียบกับค่าคงที่โดยใช้
switch-case
โครงสร้างควบคุม
- คุณสามารถสอบถามค่าทั้งหมดในการแจงนับได้โดยใช้
values
ฟิลด์ที่ 'สร้างขึ้น' สำหรับ enum แต่ละประเภท
- นี่คือการเปรียบเทียบข้อมูลประจำตัว WRT ที่ยิ่งใหญ่:ค่า enum สามารถอยู่รอดได้โดยไม่ต้องโคลน
การทำให้เป็นอนุกรมเป็น gotchya ขนาดใหญ่ ถ้าฉันจะใช้รหัสด้านบนแทน enum นี่คือลักษณะความเท่าเทียมกันของข้อมูลประจำตัว:
RoundingMode เดิม = RoundingMode.HALF_UP;
ยืนยัน (RoundingMode.HALF_UP == เดิม); // ผ่าน
ByteArrayOutputStream baos = ใหม่ ByteArrayOutputStream ();
ObjectOutputStream oos = ObjectOutputStream ใหม่ (baos);
oos.writeObject (ต้นฉบับ);
oos.flush ();
ByteArrayInputStream bais = ใหม่ ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = ObjectInputStream ใหม่ (bais);
RoundingMode deserialized = (RoundingMode) ois.readObject ();
ยืนยัน (RoundingMode.HALF_UP == deserialized); // ล้มเหลว
ยืนยัน (RoundingMode.HALF_EVEN == deserialized); // ล้มเหลว
คุณสามารถแก้ไขปัญหานี้ได้โดยไม่ต้อง enum โดยใช้เทคนิคที่เกี่ยวข้องกับการwriteReplace
และreadResolve
(ดูhttp://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html ) ...
ฉันเดาว่าประเด็นคือ - Java ออกไปจากทางที่อนุญาตให้คุณใช้อัตลักษณ์ของค่า enum เพื่อทดสอบความเท่าเทียมกัน เป็นการฝึกที่ได้รับการสนับสนุน