Java синглтон внутренний класс - PullRequest
4 голосов
/ 27 января 2012

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

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 как внутренний класс?

С уважением

Ответы [ 4 ]

7 голосов
/ 27 января 2012

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

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

private static Singleton sessionData = new NormalClass().new Singleton();
2 голосов
/ 27 января 2012

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

1 голос
/ 27 января 2012

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

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 голосов
/ 27 января 2012

Инициализация по требованию .... Джошуа Блох ..

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

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();
  }
}
...