Когда мы должны использовать неинициализированную статическую конечную переменную? Я знаю, что неинициализированной статической переменной final могут быть присвоены значения только в блоке статического инициализатора, но я не могу придумать для этого никакого реального применения.
Когда мы должны использовать неинициализированную статическую конечную переменную?
Ответы (6)
Я предполагаю, что вы имеете в виду:
public static final Object obj;
без явно заданного начального значения?
Вы можете назначить его в блоке static
на основе некоторых вычислений, которые могут выполняться только во время выполнения, например чтение некоторого файла свойств для создания константы для всего приложения, которая неизвестна во время компиляции.
null
? Гарантировано ли такое поведение в спецификациях? Мне кажется, что значение по умолчанию не определено, потому что мы не сможем прочитать его до присваивания в первую очередь (ошибка компилятора).
- person Pacerier; 17.06.2014
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);
}
В основном, если вам нужно присвоить значение, которое не может быть легко представлено в одном выражении. Например, вы можете захотеть выполнить некоторую логику для создания неизменяемой карты, а затем назначить ее.
Как правило, более читабельно поместить логику "строительства" в отдельный статический метод и использовать его в обычном присваивании:
private static final Map<String, String> FOO_MAP = buildFooMap();
Если инициализатор для статического поля может генерировать исключение, вы не можете инициализировать его в одной строке, у вас должен быть статический блок или статический метод.
Статический+Конечный
Короче говоря,
Статический — чтобы сделать его переменным класса — независимым от объекта (всегда доступным для каждого объекта в одном и том же месте)
Final - чтобы сделать его константой. (Конечно, если final стоит перед переменной!)
Где нужна только статика?
=> Может быть, чтобы подсчитать количество экземпляров объекта.
Где нужен только финал?
=> Ну сделать что-то постоянное!
Где нам нужен static+final?
=> Сделать переменную доступной для каждого объекта и сделать константой. Как при создании класса для ЦВЕТА может быть.
Для пустых статических переменных инициализация выполняется статическим блоком.
public class StaticDemo
{
private static final String name;
static
{
name = "yash";
}
}
а зачем использовать пустые? так как, возможно, вы не можете инициализировать в начале. Я принимаю предыдущий.
Статическая конечная переменная должна быть инициализирована во время создания, в отличие от пустых конечных переменных, вы не можете отложить инициализацию до конструктора, поскольку они статичны.
static final
, инициализированнуюnull
? Или вы просто имеете в виду любую переменнуюstatic final
(private static final
,public static final
и т. д.)? - person Daniel Pryden   schedule 31.01.2012