Что такое final класс в Java и какие преимущества он дает
Что проверяют
Вопрос из Java на мобильном собеседовании задают не случайно: проверяют, понимаете ли вы, что запрет наследования это про контракт и про способ вызова метода, и переносите ли вы рассуждение на Swift, где final выглядит похоже, но платите вы за него другим.
Как отвечать
Сначала по сути вопроса: final класс в Java нельзя унаследовать, поэтому ни один его метод не переопределить. Это фиксирует поведение и делает неизменяемость настоящей, из-за чего String там и объявлен final.
Дальше переводите на свою территорию, ради этого вопрос и задан. В Swift final у класса даёт то же ограничение, но добавляет то, чего в Java нет: компилятор знает единственную реализацию и заменяет вызов через таблицу методов прямым, а часто и встраивает его.
final class ImageCache {
func store(_ data: Data, for key: String) { }
}Внутри модуля при оптимизации всего модуля компилятор нередко выводит это сам, но для типа, открытого наружу, ему нужна явная гарантия. Различий стоит назвать больше: в Swift есть open и public, и публичный класс по умолчанию нельзя наследовать за пределами модуля; структуры и перечисления не наследуются вовсе, поэтому вопрос для них не возникает; @objc dynamic действует наоборот, включая динамическую отправку через среду выполнения, без которой не работают подмена методов и наблюдение за значением.
Где спотыкаются
Ограничиваются пересказом про Java и не показывают, что тема понятна им на своём языке. На мобильной позиции такой вопрос почти всегда ведёт к сравнению, и остановка на полпути читается как заученное определение.
Переносят довод о производительности не туда. В Java запрет наследования на скорость почти не влияет, машина оптимизирует вызов сама, а в Swift влияет вполне ощутимо, и смешивать эти два случая нельзя.
Ставят final подряд везде и упираются в тесты. Класс без наследников и без интерфейса нечем подменить, а частичная подмена через наследника в мобильных тестах до сих пор распространена, поэтому решение принимают вместе с решением о том, как этот код будет проверяться.