final в Java используется для:
Особенности и тонкости:
final переменная должна быть инициализирована при объявлении или в конструкторе;final ссылка не позволяет менять ссылку, но объект по ссылке можно менять (если он не immutable!);final класса (например, String, Math) невозможно;final метод, даже если класс наследуемый.final class A {} // нельзя сделать class B extends A class Parent { final void foo() { } } class Child extends Parent { // void foo() {} // ошибка: нельзя вернуть foo } final int COUNT = 10;
Можно ли изменить состояние объекта, на который ссылается final переменная?
Ответ: Да, если это не immutable-объект. Например:
final List<String> names = new ArrayList<>(); names.add("Vasya"); // Это разрешено — меняется объект по ссылке, но не сама ссылка names = new ArrayList<>(); // Ошибка компиляции
История
История
История
Появилась задача расширить внешний API, построенный на final классах. Из-за них сделать расширение оказалось невозможным, пришлось дублировать логику и поддерживать две независимые ветки продукта, что усложнило миграции.