Ответ
Модификатор final, примененный к классу, запрещает наследование от этого класса. Его нельзя использовать как суперкласс.
Эффекты и причины использования:
- Запрет наследования: Любая попытка создать подкласс вызывает ошибку компиляции.
final class Vehicle {} class Car: Vehicle {} // Ошибка компиляции: Inheritance from a final class 'Vehicle' - Оптимизация производительности: Компилятор может применять агрессивные оптимизации, такие как:
- Прямые вызовы (devirtualization): Поскольку методы не могут быть переопределены, компилятор заменяет динамическую диспетчеризацию (через vtable) на статические вызовы.
- Inlining: Тела методов
finalклассов могут быть встроены в места вызова.
- Контроль над дизайном и безопасность: Гарантирует, что поведение класса останется именно таким, как задумано автором API, предотвращая непреднамеренное или ошибочное переопределение критических методов.
final можно применять и к отдельным методам/свойствам: Это запрещает их переопределение в подклассах, но не запрещает наследование от самого класса.
class Vehicle {
final func startEngine() { /* Реализация по умолчанию */ }
}
class Car: Vehicle { // Наследование разрешено
// override func startEngine() {} // Ошибка: Cannot override final method
}
Когда использовать: Применяйте final по умолчанию к классам, которые не предназначены для специализации через наследование. Это следует принципу «запрещай, если не нужно» и улучшает производительность.