Что означает ключевое слово final и к каким сущностям оно применимо в Java
Что проверяют
Вопрос сформулирован про Java, но на позиции под iOS слушают, как вы переложите его на Swift: понимаете ли диспетчеризацию методов и знаете ли, что за неизменность значения отвечает совсем не final.
Как отвечать
Сначала короткая параллель: в Java final запрещает и переприсваивание переменной, и наследование. В Swift эти роли разделены. Запрет на изменение значения это let, а final относится только к наследованию и переопределению:
final class Loaderнельзя наследовать, и все его члены автоматически не переопределяются;final func,final var,final subscriptвнутри класса закрывают конкретный член.
К структурам, перечислениям и протоколам слово не применяют: наследования у них нет вовсе, поэтому выбор между классом и структурой закрывает вопрос раньше.
Зачем это нужно: метод класса по умолчанию вызывается через таблицу методов, то есть косвенно. Пометка final позволяет компилятору заменить косвенный вызов прямым и подставить тело. Тот же эффект внутри модуля дают private и оптимизация целого модуля, но через границу модуля правила другие: наследовать класс снаружи можно, только если он объявлен как open, обычный public для наследования уже закрыт.
Отдельно скажите, когда final мешает: он ломает всё, что опирается на подмену в рантайме, то есть наследование ради подстановки зависимости в тестах, наблюдение через KVO и обмен реализациями, где нужен @objc dynamic.
Где спотыкаются
Переносят Java дословно и говорят, что final делает свойство константой. В Swift константа это let, а final про иерархию классов.
Ставят final везде ради скорости, не думая о тестах. Через неделю выясняется, что подменить обёртку над сетью нечем, и приходится вводить протокол, а это уже правка архитектуры, а не одной строки.
Забывают, что статическая диспетчеризация бывает и без final. Метод, объявленный только в расширении класса и не входящий в протокол, наследник не переопределит: код скомпилируется, а вызовется реализация базового класса. Ловится это тестом, потому что выглядит как рабочее переопределение.