ดังที่ได้กล่าวมาแล้ว enum เป็นคลาส java ที่มีเงื่อนไขพิเศษที่นิยามของมันต้องเริ่มต้นด้วย "enum constant" อย่างน้อยหนึ่งตัว
นอกเหนือจากนั้นและ enums ไม่สามารถขยายหรือใช้เพื่อขยายคลาสอื่น ๆ enum เป็นคลาสที่เหมือนคลาสใด ๆ และคุณใช้โดยการเพิ่มเมธอดใต้คำจำกัดความคงที่:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
คุณสามารถเข้าถึงวิธีการของซิงเกิลในบรรทัดเหล่านี้:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
การใช้ enum แทนที่จะเป็นคลาสนั้นดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ ส่วนใหญ่เกี่ยวกับการสร้างอินสแตนซ์ของเธรดที่ปลอดภัยสำหรับเธรดและรับประกันได้ว่ามันจะเป็นเพียงหนึ่งสำเนาเสมอ
และที่สำคัญที่สุดคือพฤติกรรมนี้รับประกันโดย JVM เองและข้อมูลจำเพาะ Java
นี่คือส่วนหนึ่งจากข้อกำหนดคุณสมบัติ Javaเกี่ยวกับวิธีป้องกันอินสแตนซ์ enum หลายอินสแตนซ์:
ประเภท enum ไม่มีอินสแตนซ์อื่นนอกเหนือจากที่กำหนดโดยค่าคงที่ enum เป็นข้อผิดพลาดในการคอมไพล์เวลาพยายามที่จะสร้างอินสแตนซ์ประเภท enum อย่างชัดเจน วิธีการโคลนสุดท้ายใน Enum ทำให้มั่นใจได้ว่าค่าคงที่ของ enum จะไม่สามารถถูกโคลนได้และการดูแลเป็นพิเศษโดยกลไกการทำให้เป็นอนุกรมจะทำให้แน่ใจว่าอินสแตนซ์ที่ซ้ำกันจะไม่ถูกสร้างขึ้นเนื่องจากการดีซีเรียลไลเซชัน ห้ามมิให้มีการสะท้อนกลับของชนิด enum ร่วมกันสิ่งทั้งสี่นี้ทำให้แน่ใจว่าไม่มีอินสแตนซ์ประเภท enum เกินกว่าที่กำหนดโดยค่าคงที่ enum
น่าสังเกตว่าหลังจาก instantiation ข้อกังวลเรื่องความปลอดภัยของเธรดต้องได้รับการจัดการเหมือนในคลาสอื่น ๆ ด้วยคีย์เวิร์ดที่ซิงโครไนซ์เป็นต้น