Какую цель преследует использование геттеров (get-методов) в ООП?

Ответ

Геттеры (методы доступа, например, getField()) — это публичные методы, возвращающие значение приватного поля. Их основная цель — реализация принципа инкапсуляции.

Зачем они нужны:

  1. Контролируемый доступ: Позволяют скрыть внутреннее представление данных и предоставить к ним безопасный интерфейс.
  2. Гибкость реализации: Внутренняя логика хранения поля может измениться, но публичный контракт (геттер) останется прежним.
  3. Ленивая инициализация или вычисление значения: Значение может быть вычислено или загружено только в момент первого вызова геттера.
  4. Добавление side-эффектов: Логирование, проверка прав доступа, уведомление наблюдателей при чтении.

Пример:

public class TemperatureSensor {
    private double celsius;

    // Геттер может преобразовывать данные
    public double getFahrenheit() {
        return (celsius * 9 / 5) + 32;
    }

    // Геттер с ленивой инициализацией кэша
    private String cachedReport;
    public String getReport() {
        if (cachedReport == null) {
            cachedReport = generateExpensiveReport();
        }
        return cachedReport;
    }
}

Использование геттеров вместе с сеттерами (setField()) формирует паттерн JavaBean.

Ответ 18+ 🔞

Слушай, а вот эти ваши геттеры, типа getField()... Ну, блядь, зачем они вообще? Я тебе сейчас на пальцах, но с матом, объясню, а то народ путается, как хуй с пальмой.

Вот представь, у тебя есть класс, и там поле приватное. Приватное — значит, нахуй никому не свети, своё, интимное. Но другим-то надо иногда узнать, что там внутри! Вот как баба: спросишь «сколько тебе лет» — а она тебе в ответ: «А ты сам как думаешь?» И пошла пиздёж про знак зодиака. Это и есть геттер, ёпта! Не дала напрямую доступ к полю age, а выдала через метод getZodiacSign(). Контроль, блядь, полный!

А теперь по пунктам, зачем это пиздец как нужно:

  1. Контролируемый доступ, ёб твою мать! Чтобы любой левый мудак не мог взять и написать object.field = -999. А через геттер ты хоть как-то прикроешь сраку. Сказал «читай, но не трогай» — и всё, пидорас.

  2. Гибкость — овердохуища! Сегодня поле salary — это int. Завтра бухгалтерия обосралась, и надо хранить BigDecimal. Если поле публичное — всё, пизда, переписывай весь код, который к нему обращается. А если геттер getSalary() — поменял внутри него логику, и хоть в строку преобразуй, всем похуй. Контракт-то остался!

  3. Ленивая инициализация — чтоб не ебать мозги почём зря. Не надо при создании объекта сразу грузить тонну данных. Сделал геттер getReport(), и он первый раз, когда его вызовут, сходит в базу, нахуярит отчёт, кеш сохранит, а потом будет из кеша отдавать. Умно, блядь, как старый хитрый жук.

  4. Side-эффекты — ну, чтоб совсем красиво. Захотел логировать, кто и когда читает твои секретные данные — пожалуйста, в геттер добавь log.info("Какой-то пидар читает мою температуру"). Или проверку прав: «А тебе, сука, вообще можно это видеть?»

Смотри пример, тут всё понятно:

public class TemperatureSensor {
    private double celsius; // Приватное, своё, никому не отдам

    // Геттер, который не просто отдаёт, а ещё и преобразует нахуй
    public double getFahrenheit() {
        return (celsius * 9 / 5) + 32; // Вот тебе, американский дружок, твои градусы
    }

    // А это геттер с понтами — ленивый, блядь
    private String cachedReport; // Изначально тут null, пиздец пусто
    public String getReport() {
        if (cachedReport == null) { // Если ещё не ебашили отчёт
            cachedReport = generateExpensiveReport(); // Ну всё, пиздец, дорогая операция, делаем
        }
        return cachedReport; // А дальше уже из кеша, быстро, как хуй из проруби
    }
}

А если к геттеру ещё и сеттер (setField()) прикрутить — вот тебе и выходит этот ваш JavaBean, этакая стандартная банка с консервированными данными и методами-открывашками. Удобно, предсказуемо, и все фреймворки это жрут, как не в себя.