Когда мы должны использовать неинициализированную статическую конечную переменную?

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


person Sonoo Jaiswal    schedule 31.01.2012    source источник
comment
Что вы имеете в виду под пустым? Вы имеете в виду переменную static final, инициализированную null? Или вы просто имеете в виду любую переменную static final (private static final, public static final и т. д.)?   -  person Daniel Pryden    schedule 31.01.2012
comment
Он означает пустой как неинициализированный.   -  person fivedigit    schedule 31.01.2012


Ответы (6)


Я предполагаю, что вы имеете в виду:

 public static final Object obj;

без явно заданного начального значения?

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

person Tudor    schedule 31.01.2012
comment
@Tudor, почему по умолчанию null? Гарантировано ли такое поведение в спецификациях? Мне кажется, что значение по умолчанию не определено, потому что мы не сможем прочитать его до присваивания в первую очередь (ошибка компилятора). - person Pacerier; 17.06.2014
comment
@Pacerier: хорошо замечено. Действительно, было бы ошибкой времени компиляции не присвоить значение полю final, и спецификация говорит, что значение по умолчанию никогда не будет соблюдаться для таких полей. Я исправил свой ответ. - person Tudor; 17.06.2014

Он используется, когда инициализация переменной не может быть выполнена в одной строке. Например:

private static final Map<String, String> CACHE;

static {
    Map<String, String> cache = new HashMap<String, String>();
    cache.put("foo", "bar");
    cache.put("zim", "bam");
    // lots of other entries
    CACHE = Collections.unmodifiableMap(cache);
}
person JB Nizet    schedule 31.01.2012
comment
Вопрос новичка: поскольку только ссылочная переменная CACHE является окончательной, но объект, на который она ссылается, по-прежнему является просто объектом HashMap, CACHE.put(a, b) все еще можно вызывать, верно? - person jonadv; 23.07.2021

В основном, если вам нужно присвоить значение, которое не может быть легко представлено в одном выражении. Например, вы можете захотеть выполнить некоторую логику для создания неизменяемой карты, а затем назначить ее.

Как правило, более читабельно поместить логику "строительства" в отдельный статический метод и использовать его в обычном присваивании:

private static final Map<String, String> FOO_MAP = buildFooMap();
person Jon Skeet    schedule 31.01.2012

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

person Peter Lawrey    schedule 31.01.2012
comment
Благодарность! Это может быть одно использование неинициализированной статической конечной переменной. - person Sonoo Jaiswal; 31.12.2012

Статический+Конечный

Короче говоря,

Статический — чтобы сделать его переменным класса — независимым от объекта (всегда доступным для каждого объекта в одном и том же месте)

Final - чтобы сделать его константой. (Конечно, если final стоит перед переменной!)

Где нужна только статика?

=> Может быть, чтобы подсчитать количество экземпляров объекта.

Где нужен только финал?

=> Ну сделать что-то постоянное!

Где нам нужен static+final?

=> Сделать переменную доступной для каждого объекта и сделать константой. Как при создании класса для ЦВЕТА может быть.

Для пустых статических переменных инициализация выполняется статическим блоком.

public class StaticDemo
{
    private static final String name;

    static
    {  
        name = "yash";
    }
}

а зачем использовать пустые? так как, возможно, вы не можете инициализировать в начале. Я принимаю предыдущий.

person Yash    schedule 31.01.2012

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

person Javin Paul    schedule 30.09.2015