@stmassalskiy
Изучаю Java c нуля

Для чего используются геттеры и сеттеры в Java?

Добрый день! Подскажите, пожалуйста, новичку, для чего используются сеттеры и геттеры в Java?

Суть я понимаю, что они позволяют получать доступ к переменным других классов с уровнем доступа private, но зачем тогда ставить уровень доступа private на переменные, если все равно через геттеры и сеттеры можно их считать из другого класса.

Спасибо.

P.S. Сильно не ругайте, только начал осваивать Java.
  • Вопрос задан
  • 189 просмотров
Пригласить эксперта
Ответы на вопрос 7
xez
@xez Куратор тега Java
Senior Junior Roo
Вопрос, кстати, очень даже не глупый.
Вы абсолютно правильно заметили насчет нарушения инкапсуляции гетерами и сеттерами, но никто же не заставляет вас их писать. Если вы считаете, что объет должен быть иммутабельным - устанавливаете все поля final и инициализируете их только через конструктор. Насчет геттеров - тоже, в зависимости от бизнес-логики, не всегда они нужны.
По этой теме почитайте литературу про ООП (например "Объектно ориентированный подход" Вайсфельда).
И еще, например, Егор Бугаенко по этой теме имеет мнение (относиться к нему стоит со здоровым скептицизмом).
https://www.youtube.com/watch?v=lfdAwl3-X_c&t
Ответ написан
Maksclub
@Maksclub
maksfedorov.ru
Нет никакого смысла, если нормально программировать и строить простой удобный код. Этакий способ формально соблюсти инкапсуляцию и сокрытие данных: состояние приватное? Приватное :)

Чреваты тем, что плодят высокую связанность в коде, состояние и управляется снаружи (на основе геттеров) и контролируются инварианты где угодно и как угодно. По сути превращаем сущности в структуры, но тк это все же бизнес-объекты, а знания бизнес-состояния нужно — то они гуляют по всему проекту и ничем не ограничены... заплетая и заплетая код снова и снова, а также погружая в эти «сущности» все больше и больше знаний...
Доходит до того, что через заказ можно достать товар, через товар можно достать поставщика, через поставщика пользователя с данными аутентификации... и все работает со всем... плодя кучу сервисов и взрывая мозг...

По вопросу

Нужны только бля быстрых CRUD и для совместимости с кучей библиотек. А также говнокодерам «использовать данные в сервисах»

Сеттеры и геттеры нужны для разных манипуляций: валидация, костыльного маппинга, сериализации и десерриализации.

Хорошими и современной практикой сейчас является — не использование и геттеров и сеттеров...

Литература:
https://martinfowler.com/bliki/TellDontAsk.html
https://www.martinfowler.com/bliki/AnemicDomainMod...
Закон Деметры

Мои изыскания:
Зачем (не)нужны геттеры?
Геттеры/сеттеры и проблема с инкапсуляцией (примеры на Symfony, аналог Spring в php с аналогичной плохой практикой)
Ответ написан
@vabka
Токсичный
но зачем тогда ставить уровень доступа private на переменные, если все равно через геттеры и сеттеры можно их считать из другого класса.

1. Например чтобы можно было внутрь сеттера добавить какую-нибудь логику по валидации, к примеру.
2. Чтобы можно было использовать их совместно с интерфейсами
Ответ написан
@siriosca
Чтобы не иметь прямой доступ к переменным, доступ будет осуществлен только через определенные методы (сет и гет). То-есть ты будешь иметь только две возможности (вернуть и задать) значение этой переменной. Другие манипуляции НЕВОЗМОЖНЫ.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
но зачем тогда ставить уровень доступа private на переменные, если все равно через геттеры и сеттеры можно их считать из другого класса.

Для того, чтобы их нельзя было считывать напрямую. В этом и смысл геттеров-сеттеров
Ответ написан
@Nickname192
Ответ очевиден! Чтобы обработать данные! Свойства(поля) не умеют обрабатывать, а геттеры и сеттеры это методы(функций), метод может обрабатывать эти данные и вызвать исключения в случае неправильного использования.
Ответ написан
pazukdev
@pazukdev
Java Dev
Суть я понимаю, что они позволяют получать доступ к переменным других классов с уровнем доступа private


Они позволяют получать контролируемый доступ. Любая сущность должна быть доступна для внешней среды только через интерфейс. Public методы - это интерфейс любго класса. Setter'ы и Getter'ы - часть этого интерфейса.
Хотя аксессоры действительно в какой-то мере могут казаться формализмом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы