Поточная безопасная ленивая инициализация с не конечным экземпляром - PullRequest
0 голосов
/ 25 марта 2020

Я видел этот ответ здесь , показывающий, как сделать потокобезопасную ленивую инициализацию финального синглтона stati c.

Но что является лучшим решением, если у вас есть класс? ленивая загрузка не финал? (У него есть несколько методов, которые вы хотите вызвать после его создания)

Безопасно ли просто помещать вызовы метода в блок stati c?

public class Something {

    private static class LazyHolder {
            public static final Something INSTANCE = new Something();
            static {
                    INSTANCE.setValue("foo");
            }
    }

    public static Something getInstance() {
            return LazyHolder.INSTANCE;
    }
}

1 Ответ

1 голос
/ 25 марта 2020

Это идиома IODH (метод инициализации по требованию).

Но что является лучшим решением, если класс, который вы загружаете, не является окончательным? (У него есть несколько методов, которые вы хотите вызвать после его создания)

Не имеет значения, является ли ваш "INSTANCE" окончательным или нет. Он будет загружен лениво (при первом вызове метода getInstance).
Цель окончательного выполнения INSTACE - убедиться, что он всегда указывает на один тип объекта, но вы можете изменять свойства объекта.

...