Java - в чем разница между инициализацией одноэлементных и статических блочных классов?

Недавно я выучил синглтон-паттерн. И должен был понять один. Например:

public class Singleton {
    private static Singleton instance;

    private InnerObject innerObject; //all functionality is here

    private Singleton() {
        innerObject = new InnerObject();
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    public InnerObjectResult getResult() {
        return innerObject.getResult(); //delegate method call
    }
}

Но раньше я понял это так:

public class Singleton {
    private static InnerObject innerObject;

    static {
        innerObject = new InnerObject();
    }

    public static InnerObjectResult getResult() {
        return innerObject.getResult();
    }
}

Таким образом, результат тот же: innerObject инициализируется один раз, но код чище, и мне не нужно беспокоиться о многопоточности. Я знаю, что шаблон не зависит от конкретных языков, и, вероятно, вы не можете сделать что-то подобное в другом месте, но меня интересует именно эта ситуация. Большое спасибо!

0 ответов

Другие вопросы по тегам