Ответ
Класс, объявленный с модификатором final, не может быть унаследован (от него нельзя создавать подклассы). Это ключевой механизм для обеспечения неизменяемости (immutability) и безопасности, предотвращающий изменение поведения класса через наследование.
Пример final-класса (неизменяемый DTO):
public final class ImmutablePoint {
private final double x;
private final double y;
// Все поля инициализируются в конструкторе
public ImmutablePoint(double x, double y) {
this.x = x;
this.y = y;
}
// Только геттеры, сеттеров нет
public double getX() { return x; }
public double getY() { return y; }
// Для "изменения" состояния возвращается новый объект
public ImmutablePoint withX(double newX) {
return new ImmutablePoint(newX, this.y);
}
}
Ключевые моменты:
finalкласс:public final class ImmutablePoint— запрещает наследование.finalполя:private final double x— значения присваиваются только в конструкторе и не могут быть изменены.- Отсутствие сеттеров: Состояние объекта нельзя изменить после создания.
- Потокобезопасность: Неизменяемые объекты по своей природе безопасны для использования в многопоточных средах.
Зачем это нужно?
- Безопасность: Классы вроде
String,Integer—final, чтобы их внутреннее состояние нельзя было изменить через подкласс. - Проектирование API: Гарантирует, что логика класса не будет переопределена.
- Оптимизация: JVM может выполнять дополнительные оптимизации для
final-классов и методов.