Почему обязательно инициализировать конечные переменные stati c? - PullRequest
3 голосов
/ 13 февраля 2020

Рассмотрим переменную static, например:

private static int x;

Если мы попытаемся напечатать ее значение в методе main, оно будет равно 0. Таким образом, переменная инициализируется. Теперь рассмотрим, является ли переменная final:

private static final int x;

Это невозможно; Почему? Мы должны инициализировать его как private static final int x = 2; или использовать инициализатор stati c, например:

static {
    x = 2;
}

Переменная static инициализируется по умолчанию; так почему же возникает ошибка компиляции, если переменная тоже final?

Ответы [ 3 ]

7 голосов
/ 13 февраля 2020

В принципе язык может позволить вам объявить поле static final и получить его значение по умолчанию, но на практике, если вы не можете указать явное значение для поля static final, то это почти всегда по ошибке. Таким образом, компилятор выдает здесь ошибку, потому что

  1. Этот код выполняет то, что вы почти наверняка не хотели делать (или не может выполнить то, что вы почти наверняка сделали хотите сделать), и
  2. Значением по умолчанию будет что-то тривиальное, например, 0 или null, поэтому, если использовать это значение , то будет , что вы намеревались, тогда неудобства, налагаемые на вас, будут минимальными; вам просто нужно написать static final int x = 0; вместо static final int x;.

Фактически, принудительное написание = 0 или = null явно делает ваш код легче для чтения, понимания и обслуживания. Имейте в виду, что большая часть кода будет читаться в сотни или тысячи раз чаще, чем написано, поэтому вы экономите время, будучи более подробными и явными.

0 голосов
/ 13 февраля 2020

ПРИМЕЧАНИЕ: Ключевое слово stati c в заголовке вашего вопроса может быть удалено, потому что вы должны инициализировать все конечные переменные, а не только stati c final.

Все конечные переменные должны быть явно инициализированы либо в точке объявления, либо в каждом конструкторе класса, в котором они объявлены (в данном случае он называется пустая конечная переменная ). Это потому, что окончательное значение переменной не может быть изменено после первого присваивания. Таким образом, язык выдает предупреждение о неявном присваивании конечным переменным, чтобы заставить разработчика явно назначить значение (даже если это значение по умолчанию, например '0' для целых чисел).

Более того, в заданном c случае переменной "stati c final" вы также можете присвоить значение в инициализаторе stati c класса, в котором она объявлена.

0 голосов
/ 13 февраля 2020

Абзац из Oracle Документация : последний модификатор указывает, что значение этого поля не может быть изменено.

Например, следующее объявление переменной определяет константу с именем PI, значение которой является приближением к пи (отношение длины окружности к ее диаметру):

static final double PI = 3.141592653589793;

Константы, определенные таким образом, не могут быть переназначены, и это ошибка времени компиляции, если ваша программа пытается Сделай так. По соглашению имена постоянных значений пишутся заглавными буквами. Если имя состоит из более чем одного слова, слова разделяются подчеркиванием (_).

Редактировать: Пожалуйста, проверьте java спецификацию языка . Ответ на ваш вопрос есть.

...