← Назад к вопросам

Можно ли использовать сеттеры в final классе?

1.0 Junior🔥 111 комментариев
#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сеттеры в final классе

Краткий ответ

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

Что запрещает final?

final класс просто нельзя расширять (наследоваться):

// ✅ Можно создавать объекты
String str = new String("hello");

// ❌ Нельзя наследоваться
public class MyString extends String {  // Ошибка компиляции!
    // Error: cannot extend final class String
}

Сеттеры в final классе

Сеттеры работают нормально в final классе:

public final class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // ✅ Сеттеры работают
    public void setName(String name) {
        this.name = name;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}

// Использование:
Person p = new Person("Иван", 25);
p.setName("Пётр");  // Отлично работает!
p.setAge(30);

Отличие: неизменяемость полей

Если хочешь сделать объект действительно неизменяемым, используй final для полей:

// ❌ Мутабельный класс (можно менять)
public final class MutablePerson {
    private String name;  // Можно менять
    
    public void setName(String name) {
        this.name = name;  // ✓ Сработает
    }
}

// ✅ Неизменяемый класс (нельзя менять)
public final class ImmutablePerson {
    private final String name;  // Нельзя менять
    
    public ImmutablePerson(String name) {
        this.name = name;
    }
    
    // ❌ Сеттер невозможен
    // public void setName(String name) {
    //     this.name = name;  // Error: cannot assign to final variable
    // }
    
    public String getName() {
        return name;
    }
}

Три слоя final

public final class Example {
    // 1. final класс — нельзя наследоваться
    
    public final String field;  // 2. final поле — нельзя переприсваивать
    
    public final void method() {  // 3. final метод — нельзя переопределять
    }
}

Эти три применяют независимо друг от друга.

Примеры Java

String — это final класс, но мутабельные объекты:

public final class String implements Serializable, Comparable<String> {
    // Отличие: все поля внутри final
    private final byte[] value;  // Но сам класс final
    
    public String(String original) {
        // ...
    }
    
    // Нет публичных сеттеров — неизменяемый класс
}

StringBuilder — НЕ final класс, но с методами-мутаторами:

public final class StringBuilder {  // Это final
    // Поля не final — мутабельный
    
    public StringBuilder append(String str) {  // Изменяет содержимое
        // ...
    }
}

Когда использовать?

final класс + мутабельные поля + сеттеры:

  • Когда нужна безопасность от наследования
  • Но объекты должны быть изменяемы
  • Пример: ArrayList, HashMap

final класс + final поля (без сеттеров):

  • Когда нужна полная неизменяемость
  • Пример: String, Integer, LocalDate
  • Безопаснее для многопоточности

Вывод

✅ Да, сеттеры работают в final классе

final класс защищает от наследования, final поля защищают от изменений

✅ Для полной неизменяемости используй final для полей, не для класса

❌ Путайте final класс с неизменяемостью объектов

Можно ли использовать сеттеры в final классе? | PrepBro