Daha önce de belirtildiği gibi, bir enum, tanımının en az bir "enum sabiti" ile başlaması gereken özel koşulu olan bir java sınıfıdır.
Bunun dışında ve numaralandırmalar genişletilemez veya diğer sınıfları genişletmek için kullanılamaz, bir numaralandırma herhangi bir sınıf gibi bir sınıftır ve bunu sabit tanımların altına yöntemler ekleyerek kullanırsınız:
public enum MySingleton {
INSTANCE;
public void doSomething() { ... }
public synchronized String getSomething() { return something; }
private String something;
}
Singleton'un yöntemlerine şu satırlardan erişirsiniz:
MySingleton.INSTANCE.doSomething();
String something = MySingleton.INSTANCE.getSomething();
Sınıf yerine bir enum kullanımı, diğer cevaplarda belirtildiği gibi, çoğunlukla singletonun iş parçacığıyla güvenli bir şekilde başlatılması ve her zaman sadece bir kopya olacağının garantisidir.
Ve belki de en önemlisi, bu davranışın JVM'nin kendisi ve Java spesifikasyonu tarafından garanti edildiğini.
Java belirtiminden bir numaralandırma örneğinin birden çok örneğinin nasıl önlendiğine ilişkin bir bölüm aşağıda verilmiştir :
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 bir derleme zamanı hatasıdır. Enum'daki son klon yöntemi, enum sabitlerinin asla klonlanmamasını ve serileştirme mekanizmasının özel muamelesi, serileştirmenin bir sonucu olarak asla yinelenen örneklerin oluşturulmamasını sağlar. Enum tiplerinin yansıtıcı örneklenmesi yasaktır. Birlikte, bu dört şey, enum sabitleri tarafından tanımlananların ötesinde bir enum tipi örneklerin bulunmamasını sağlar.
Dikkat edilmesi gereken nokta, somutlaştırmadan sonra, herhangi bir iş parçacığı güvenliği endişesinin, senkronize edilmiş anahtar kelime vb. İle herhangi bir sınıfta olduğu gibi ele alınması gerektiğidir.