Почему не рекомендуется делать поля класса открытыми (public)?

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

Ответ

Открытые поля нарушают принцип инкапсуляции — один из ключевых принципов ООП. Это приводит к проблемам с поддержкой, контролем состояния и безопасностью.

Проблемы открытых полей:

  • Отсутствие контроля: Невозможно валидировать данные при присваивании.
  • Сложность рефакторинга: Изменение внутренней реализации класса затронет весь код, который напрямую обращается к полю.
  • Нарушение инвариантов: Внешний код может перевести объект в некорректное состояние.

Правильный подход (Инкапсуляция):

class Person {
    // Поле закрыто для прямого доступа
    private String name;
    private int age;

    // Контролируемый доступ через методы (геттеры/сеттеры)
    public String getName() { return name; }

    public void setName(String name) {
        if (name == null || name.trim().isEmpty()) {
            throw new IllegalArgumentException("Name cannot be empty");
        }
        this.name = name;
    }

    public int getAge() { return age; }

    public void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("Age cannot be negative");
        }
        this.age = age;
    }
}

Исключение: Константы (public static final) — допустимы, так как их состояние неизменно.

public static final double PI = 3.14159;