Что такое final-класс в Java? Приведи пример.

«Что такое final-класс в Java? Приведи пример.» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Класс, объявленный с модификатором 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);
    }
}

Ключевые моменты:

  1. final класс: public final class ImmutablePoint — запрещает наследование.
  2. final поля: private final double x — значения присваиваются только в конструкторе и не могут быть изменены.
  3. Отсутствие сеттеров: Состояние объекта нельзя изменить после создания.
  4. Потокобезопасность: Неизменяемые объекты по своей природе безопасны для использования в многопоточных средах.

Зачем это нужно?

  • Безопасность: Классы вроде String, Integerfinal, чтобы их внутреннее состояние нельзя было изменить через подкласс.
  • Проектирование API: Гарантирует, что логика класса не будет переопределена.
  • Оптимизация: JVM может выполнять дополнительные оптимизации для final-классов и методов.