Когда используют сеттеры (setter-методы)?

«Когда используют сеттеры (setter-методы)?» — вопрос из категории ООП, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сеттеры — это публичные методы для изменения приватных полей объекта. Их основное назначение — обеспечить инкапсуляцию, то есть скрыть внутреннее представление данных и контролировать способ их модификации.

Использую сеттеры, когда нужно:

  1. Добавить валидацию. Прежде чем присвоить значение, можно проверить его корректность.
  2. Выполнить побочные действия. Например, логировать изменение, уведомлять наблюдателей или пересчитывать зависимые поля.
  3. Сохранить инварианты объекта. Гарантировать, что внутреннее состояние всегда остается согласованным.

Пример на Java:

public class BankAccount {
    private String owner;
    private double balance;

    // Сеттер с валидацией
    public void setOwner(String owner) {
        if (owner == null || owner.trim().isEmpty()) {
            throw new IllegalArgumentException("Owner name cannot be empty");
        }
        this.owner = owner.trim();
    }

    // Сеттер с бизнес-логикой и поддержанием инварианта (баланс не отрицательный)
    public void deposit(double amount) { // Это тоже вид "сеттера" для баланса
        if (amount <= 0) {
            throw new IllegalArgumentException("Deposit amount must be positive");
        }
        this.balance += amount;
        this.lastTransaction = LocalDateTime.now(); // Побочное действие
    }

    // Геттер
    public double getBalance() {
        return balance;
    }
}

Когда сеттеры не нужны: Для простых DTO (Data Transfer Objects) или Value Objects, которые являются всего лишь контейнерами для данных без поведения. В таких случаях можно использовать публичные поля final или record в Java.