Ответ
Ключевое слово final отключает динамическую диспетчеризацию для класса, его методов или свойств, позволяя компилятору применять оптимизации.
Как это работает:
- Статическая диспетчеризация: Компилятор точно знает, какая реализация метода будет вызвана (так как переопределение невозможно). Это убирает необходимость поиска в таблице виртуальных методов (vtable) во время выполнения.
- Инлайнинг (Inlining): Компилятор может встроить тело
final-метода прямо в место вызова, устраняя накладные расходы на вызов функции.
Пример:
final class NetworkManager {
// Компилятор знает, что этот метод не будет переопределен
func sendRequest() {
// ... код запроса
}
}
let manager = NetworkManager()
manager.sendRequest() // Вызов может быть оптимизирован или инлайнен
Когда использовать:
- Для классов, которые заведомо не предназначены для наследования (например, утилитарные или фасадные классы).
- В performance-critical коде, где важна максимальная скорость.
Осторожно: Необоснованное использование final ограничивает расширяемость и тестируемость кода.