Можно ли определять сеттеры (setter methods) в final-классе Java?

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

Ответ

Да, можно. Модификатор final для класса запрещает только наследование от него, но не влияет на возможность изменения состояния его объектов.

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

  • final класс может иметь не-final поля.
  • Для изменения этих полей можно использовать обычные сеттеры.
  • Сеттеры внутри final класса не могут быть переопределены (так как наследование невозможно), но это не мешает их вызову.

Пример:

public final class ImmutableContainer {
    private String data; // Поле не final

    // Обычный сеттер в final классе
    public void setData(String newData) {
        this.data = newData;
    }

    public String getData() {
        return data;
    }
}
// Использование
ImmutableContainer container = new ImmutableContainer();
container.setData("New Value"); // Работает

Отличие от final методов: Если бы сеттер был объявлен как final, это означало бы, что он не может быть переопределен в подклассе, что в контексте final класса избыточно.