Инициализация по запросу для нескольких статических переменных без статических вложенных классов?

Я хочу иметь класс с несколькими статическими переменными, которые будут инициализироваться только по требованию.

public class Messages {
    public static final String message1 = init1();
    public static final String message2 = init2();
}

Поэтому, когда где-то в коде я ссылаюсь на Messages.message1, я хочу, чтобы вызывался только init1(). Если позже я получу доступ к Messages.message2, то только в это время должен быть вызван init2().

Я знаю, что это можно сделать с помощью Идиома держателя инициализации по запросу , но это неудобно, если у вас много полей.

Есть ли другой способ?


person Roland    schedule 26.10.2014    source источник
comment
Подобно тому, что вы связали, вместо ссылки на поле вызовите метод. Метод вернет (и кэширует) инициализированное значение.   -  person Sotirios Delimanolis    schedule 26.10.2014
comment
enum singleton может помочь?   -  person SMA    schedule 26.10.2014


Ответы (1)


Наиболее распространенным способом ленивой инициализации является инициализация в методе получения:

public class Messages {
    private static String message1;
    public static String getMessage1() {
        if (message1 == null)
            message1 = init1();
        return message1;
    }
}

Если вам нужны ровно public final static поля, то в Java невозможно добиться отдельной инициализации для них. Все члены класса инициализируются вместе.

person Stanislav Lukyanov    schedule 26.10.2014