Когда мы должны использовать неинициализированную статическую переменную final? - PullRequest
10 голосов
/ 31 января 2012

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

Ответы [ 6 ]

17 голосов
/ 31 января 2012

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

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);
}
8 голосов
/ 31 января 2012

Полагаю, вы имеете в виду:

 public static final Object obj;

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

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

5 голосов
/ 31 января 2012

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

Как правило, удобнее читать «строительную» логику в отдельном статическом методе и использовать ее в обычном режиме.хотя назначение:

private static final Map<String, String> FOO_MAP = buildFooMap();
0 голосов
/ 30 сентября 2015

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

0 голосов
/ 31 января 2012

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

0 голосов
/ 31 января 2012

Статический + Финальный

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

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

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

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

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

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

=> Хорошо, чтобы сделать что-то постоянным!

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

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

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

public class StaticDemo
{
    private static final String name;

    static
    {  
        name = "yash";
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...