Ответ
Сеттеры — это публичные методы для изменения приватных полей объекта. Их основное назначение — обеспечить инкапсуляцию, то есть скрыть внутреннее представление данных и контролировать способ их модификации.
Использую сеттеры, когда нужно:
- Добавить валидацию. Прежде чем присвоить значение, можно проверить его корректность.
- Выполнить побочные действия. Например, логировать изменение, уведомлять наблюдателей или пересчитывать зависимые поля.
- Сохранить инварианты объекта. Гарантировать, что внутреннее состояние всегда остается согласованным.
Пример на 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.