2015-12-23 2 views
-3
public class Singleton { 
    private static class SingletonHolder { 
     private static final Singleton INSTANCE = new Singleton(); 
    } 

    private Singleton() { 
    } 

    public static Singleton getInstance() { 
    return SingletonHolder.INSTANCE; 
    } 

    public static void main(String args[]) { 
    Singleton s = new Singleton(); 
    Singleton s2 = new Singleton(); 
    } 
    } 

Основываясь на «Эффективной Java», одноэлементный класс является чем-то вроде выше.Проблемы с классом Singleton в Java

Предположим, что у нас есть основная часть этого класса. Мы можем инициировать одноэлементный класс стольких раз, сколько мы хотим, как

Singleton s1=new Singleton(); 
Singleton s2=new Singleton(); 
Singleton s3=singleton.getInstance(); 
Singleton s4=singleton.getInstance(); 

Но одноплодной класс должен быть класс, который может быть инициироваться только один раз, но компилятор не выдаст ошибку, если мы объявляем несколько экземпляров выше , Зачем?

+2

Читайте об инкапсуляции. Конечно, внутри класса вы можете делать все, что хотите. Однако за его пределами ... –

+0

Кто бы ни вычитал меня, то pls объясняют, почему мой вопрос является уникальным вопросом, связанным с классом singleton в Java. – sevenxuguang

ответ

0

Класс singleton должен быть классом, который может быть создан только один раз другими классами. Обычно это достигается с помощью частного конструктора. Однако частный конструктор не может предотвратить создание экземпляра внутри класса.

Вы должны прочитать этот вопрос, хотя: What is an efficient way to implement a singleton pattern in Java?

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

+0

Но внутри того же пакета я объявляю другой класс, но я также могу инициировать столько случаев, сколько хочу? Я просто попытался затмение, но ошибок не было .... – sevenxuguang

+0

Вы использовали перечисление? Просто невозможно указать более одного экземпляра для типа перечисления. Кроме того, компилятор никогда не выдает ошибку, говорящей что-то вроде «Вы только что создали два экземпляра одноэлементного». Синтаксис - это шаблон, и компилятор не проверяет его. –

+0

Я не использую перечисление. Если я могу создать несколько экземпляров в другом классе, в чем смысл создания «singleton class»? – sevenxuguang

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