В Java разрешается создавать пустые константы — поля, объявленные как final, которым, однако, не было присвоено начальное значение. Во всех случаях пустую константу обязательно нужно инициализировать перед использованием, и компилятор следит за этим. Впрочем, пустые константы расширяют свободу действий при использовании ключевого слова final, так как, например, поле final в классе может быть разным для каждого объекта, и при этом оно сохраняет свою неизменность. Пример:
//: reusing/BlankFinal.java
// "Пустые" неизменные поля.
class Poppet {
private int i;
Poppet(int ii) { i = ii; }
}
public class BlankFinal {
private final int i = 0; // Инициализированная константа
private final int j; // Пустая константа
private final Poppet p; // Пустая константа-ссылка
// Пустые константы НЕОБХОДИМО инициализировать в конструкторе:
public BlankFinal() {
j = 1; // Инициализация пустой константы
p = new Poppet(1); // Инициализация пустой неизменной ссылки
}
public BlankFinal(int x) {
j = x; // Инициализация пустой константы
p = new Poppet(x); // Инициализация пустой неизменной ссылки
}
public static void main(String[] args) {
new BlankFinal();
new BlankFinal(47);
}
}
Значения неизменных (final) переменных обязательно должны присваиваться или в выражении, записываемом в точке определения переменной, или в каждом из конструкторов класса. Тем самым гарантируется инициализация полей, объявленных как final, перед их использованием.