Инициализировать статическую конечную переменную - PullRequest
3 голосов
/ 02 июля 2010

Мне было интересно, в чем разница между различными способами инициализации статической конечной переменной?

private static final int i = 100;

или

private static final int i;
static {
    i = 100;
}

Есть ли различия между этими двумя?

Ответы [ 6 ]

10 голосов
/ 02 июля 2010

Если вы устанавливаете только переменные, обе формы эквивалентны (и вы должны использовать первую, поскольку она более читабельна и лаконична).

Форма static {} существует для случаев, когда вам также необходимовыполнять операторы, отличные от присвоений переменных.(Несколько надуманный) пример:

private static final int i;
static {
    establishDatabaseConnection();
    i = readIntFromDatabase;
    closeDatabaseConnection();
}
2 голосов
/ 02 июля 2010

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

1 голос
/ 02 июля 2010

Вы также можете использовать инициализацию Forward Reference

public class ForwardReference {
private static final int i  = getValue();
private static final int j = 2;
public static void main(String[] args) {
    System.out.println(i);
}

private static int getValue() {
    return j*2;
}

}

Ключ в том, что мы получаем значение 'j' из 'getValue' до того, как 'j' было объявлено,Статические переменные инициализируются в порядке их появления.

Это выведет правильное значение '4'

1 голос
/ 02 июля 2010

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

См. официальный тур Java .

1 голос
/ 02 июля 2010

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

1 голос
/ 02 июля 2010

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

Существует также разница, когдав классе init выполняется статический блок fields и die, но у меня нет подробностей, см. спецификацию языка для создания экземпляров класса для получения дополнительной информации.

Greetz, GHad

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