2014-09-11 2 views
0

Недавно я узнал, что enum - более эффективный способ реализовать синглтон.преимущество перечисления над классом в одноэлементном шаблоне

Singleton с enum:

public enum Singleton{ 
INSTANCE; 
    public void doStuff(){ 
     //...... 
    } 
    public void doMoreStuff(){ 
     //...... 
    } 
} 

Singleton с class:

public class Singleton{ 
    private static final INSTANCE = new Singleton(); 

    private Singleton(){} 

    public static Singleton getInstance(){ 
     return INSTANCE; 
    } 

    public void doStuff(){ 
     //...... 
    } 
    public void doMoreStuff(){ 
     //...... 
    } 
} 

ВОПРОС: Каковы возможные преимущества и недостатки использования перечисления над классом для реализации одиночки?

+2

Евангелие от Джошуа Блоха: [Пункт 3: Принудительное использование свойства singleton с помощью частного конструктора или типа перечисления] (http://www.informit.com/articles/article.aspx?p=1216151&seqNum= 3) –

+1

Синглы - зло. Вместо этого используйте инъекцию. – eitanfar

+0

@ Duncan: так, согласно статье, «одноэлементный тип перечисления - лучший способ реализовать синглтон»? eitanfar: может быть, но мне нужно знать, что лучше. –

ответ

0

Как explained by Joshua Bloch, два подхода функционально идентичны, если ваш синглтон не является сериализуемым. Хотя вы можете добавить код в свой собственный конструктор Singleton, чтобы предотвратить отражение, используемое для создания второго экземпляра.

Если ваш синглтон является сериализуемым, то подход enum предоставит всю необходимую сантехнику бесплатно, тогда как при использовании статического поля вы должны добавить это самостоятельно.

На мой взгляд, нет недостатка в использовании подхода enum.

Смежные вопросы