Что такое final класс в Java и какие преимущества он дает
Что проверяют
Понимаете ли вы, что final у класса это решение о контракте наследования, а не микрооптимизация. Хороший ответ отделяет final класс от final метода и final поля и объясняет, когда запрет наследования уместен.
Как отвечать
Final класс нельзя расширить: попытка написать наследника не компилируется. Следствие важнее формулировки: ни один метод такого класса невозможно переопределить, значит поведение, которое вы задокументировали, увидит и вызывающая сторона.
Что это даёт:
- неизменяемость становится настоящей. Наследник ломает immutable-класс переопределённым геттером или собственным изменяемым состоянием, поэтому
Stringобъявлен final, и на этом держатся кэширование хеш-кода, пул строк и безопасная передача строки в чужой код; - сокращается контракт сопровождения. Класс, открытый для наследования, обязан документировать собственные самовызовы и сохранять их порядок между версиями, иначе обновление библиотеки ломает потомков;
- проверки в конструкторе нельзя обойти через подкласс.
Принцип формулируется коротко: класс либо спроектирован под наследование и это описано, либо наследование запрещено. Промежуточный вариант, когда класс открыт просто на всякий случай, хуже обоих.
Назовите и альтернативы: композиция с делегированием вместо наследования, final метод, если закрыть надо одну точку, запечатанные иерархии, когда список наследников известен заранее.
Где спотыкаются
Приписывают final заметный прирост скорости. Виртуальная машина и без него видит единственную загруженную реализацию и встраивает вызов, так что выигрыш обычно неизмерим, а сам аргумент звучит заученно.
Путают уровни. Final у поля запрещает переприсваивание ссылки, но не мешает менять объект по этой ссылке, а final у метода закрывает только его, оставляя класс открытым.
Не думают про тестирование. Final класс без интерфейса тяжело подменить в тестах, и в чужом коде он превращается в зависимость, которую нечем заменить, поэтому запрет наследования обычно идёт в паре с выделенным интерфейсом или фабрикой.