Ответ
Ключевое слово final, применённое к объявлению класса, запрещает создание от него подклассов (наследование).
Пример:
// Класс, объявленный как final, не может быть унаследован
final class ImmutableApiConfig {
private final String baseUrl;
public ImmutableApiConfig(String url) {
this.baseUrl = url;
}
public String getBaseUrl() {
return baseUrl;
}
}
// Попытка наследования вызовет ошибку компиляции:
// error: cannot inherit from final ImmutableApiConfig
class ExtendedConfig extends ImmutableApiConfig {
// Этот код не скомпилируется
}
Зачем это нужно?
- Обеспечение неизменяемости (immutability): Часто используется для классов, которые должны гарантировать, что их поведение не будет изменено через наследование (например,
String). - Безопасность и проектирование: Предотвращает непреднамеренное или злонамеренное изменение критичной логики класса-предка.
- Оптимизация: Компилятор может применить дополнительные оптимизации, зная, что у класса не может быть подклассов.
Примечание: Ключевое слово final также может применяться к методам (запрещает переопределение в подклассах) и переменным (делает ссылку или примитив неизменяемыми).