2012-01-27 6 views
2

Я знаю концепцию singleton в Java. У меня возникают проблемы с созданием singleton как внутреннего класса в Java. Проблема возникает у держателяJava singleton внутренний класс

public class NormalClass { 
    private class Singleton { 
     private static Singleton instance = null; 

     private Singleton() { 
     } 

     private static class SingletonHolder { 
      private static Singleton sessionData = new Singleton(); 
     } 

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

    public void method1() { 
     Singleton.getInstance(); 
    } 
} 

Ошибка при вызове конструктора Singleton(). Как правильно вызвать частный конструктор Singleton как внутреннего класса?

С уважением

ответ

7

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

Причина, по которой ваш вызов конструктора не работает, объясняется в уроке Java nested classes. В основном, внутренний класс требует экземпляр внешнего класса, прежде чем он может быть построен:

private static Singleton sessionData = new NormalClass().new Singleton(); 
2

Вы не можете объявить статические классы в нестатической классе. Сделайте класс Singleton статическим, и все должно компилироваться просто отлично.

1

Проблема заключается в том, что внутренний класс не является статическим внутренним классом,

public class NormalClass { 
    private static class Singleton { 
     private static Singleton instance = null; 

     private Singleton() { 
     } 

     private static class SingletonHolder { 
      private static Singleton sessionData = new Singleton(); 
     } 

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

    public void method1() { 
     Singleton.getInstance(); 
    } 
} 
0

Initialize по требованию .... Joshua Bloch ..

Я думаю, что если ваш внутренний класс является статическим, ваш держатель класс также должен быть статическим.

private static class SingletonHolder { 
    static final Singleton instance = new Singleton(); 
} 

Или почему бы не так? почему вообще класс внутреннего держателя?

public class NormalClass{ 
    private static class InnerClass{ 
    private static InnerClass instance = null; 
    private InnerClass(){} 
    public static InnerClass getInstance() { 
    if(null==NormalClass.InnerClass.instance){ 
    NormalClass.InnerClass.instance = new InnerClass(); 
    } 
    return NormalClass.InnerClass.instance; 
} 
    } 

    public void test(){ 
    InnerClass.getInstance(); 
    } 
} 
Смежные вопросы