Ответ
Да, можно. Модификатор 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 класса избыточно.