Беда со статическим полем и синглтоном - PullRequest
7 голосов
/ 24 января 2012

У меня есть два класса:

public class Singleton{
    private Singleton(){...}

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

    public static Singleton getInstance(){
        return InstanceHolder.instance;
    }
}

и

public class Someclass{
    private static final Singleton singleton=Singleton.getInstance();

    public static Singleton getSingleton(){
        return singleton;
    }
}

Задача

Если где-то (на самом деле, в другом конструкторе синглтон-класса) я использую что-то вроде этого:

private final Singleton singleton=Someclass.getSingleton();

my singleton всегда null

Вопрос Почему?

Ответы [ 2 ]

8 голосов
/ 24 января 2012

Ваш пример работает нормально, поэтому он неполон.

Возможно, в вашем реальном приложении у вас есть цикл зависимости между вашими классами, так что getSingleton() вызывается до завершения инициализации Someclass, что-то вроде следующего, но с участием нескольких классов:

public class Foo {
    private static Foo INSTANCE = new Foo(); // Prints null
    private static String s = "foo";

    public Foo() {
        System.out.println(s);
    }
}

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

Кроме того, возможно, было бы лучше использовать какой-либо шаблон DI или шаблон Service Locator, а не реализовывать поведение синглтона вручную.

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

Вы должны создать экземпляр singleton при первом вызове getInstance(), а не статически.Это будет работать независимо от циклов зависимости.

public class Singleton {
  private static Singleton instance = null;

  private Singleton(){...}

  public static Singleton getInstance() {
    if(instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...