Много раз переменные класса в java объявляются как частные для инкапсуляции.
Другие проблемы с объявлением переменной как приватной заключаются в том, что она может быть доступна только из того же класса, но, наконец, в большинстве случаев вы в конечном итоге используете методы set и get для изменения переменной или для получения ее вне класса.
Итак, мне интересно, есть ли веская причина объявлять приватную переменную и помещать set и get вместо того, чтобы объявлять ее общедоступной и избегать set и get .
Предоставление свободного доступа к атрибутам класса — это не обреченный проект, он просто другой. Обычно этого избегают, чтобы класс внутренне обрабатывал любую бизнес-логику, которую он может прикрепить к полям. Например:
Если бы мы потом захотели добавить валидации в этот код, ситуация усложнилась бы. Конечно, в приведенном выше примере вы его не видите, потому что вызовов всего около 3
Foo#listaNombres
, но если он будет разбросан по десяткам методов, ситуация усложнится. Кроме того, это также усложняет, если определение атрибута (имя, тип и т. д.) было изменено из-за всех изменений, которые будут сделаны. Дополнительная проблема заключается в том, что при получении спискаFoo#listaNombres
мы не хотим передавать список напрямую, вместо этого нам нужна его копия. Мы могли бы сделать копию в каждом месте,foo.listaNombres
но это приведет к дублированию кода (точнее, умножению, а не дублированию).Использование методов
get
andset
(предпочтительно общедоступных) соответствует спецификации JavaBean :Переведено:
Это означает, что методы get и set позволяют получить доступ к свойствам (атрибутам) класса. Многие фреймворки выигрывают от этого определения. Назвать несколько:
Размещение примера из Spring с конфигурацией XML:
Класс Java, связанный с этим компонентом:
Пример JSF для ассоциации полей с использованием языка выражений:
Связанный класс Java:
Кроме того, "приятная" (?) вещь в использовании этих методов заключается в том, что вы можете добавить к ним бизнес-логику, чтобы избежать прямого контакта с объектами, с которыми вы взаимодействуете. Из предыдущего случая, когда мы указали, что хотим получить копию списка, а не получать список напрямую, мы могли бы добавить такую логику в методе get:
Если создание кода для этих методов кажется слишком трудоемким, вы можете использовать lombok , который предлагает средства для добавления этих методов с помощью аннотаций в ваш код, среди других преимуществ.
Адаптировано из частного списка с Getter/Setter vs Public List
Вы только что ответили на один из самых распространенных вопросов разработчиков: «Использую ли я свойства или напрямую обращаюсь к атрибутам класса?» В других ответах у вас есть хорошие примеры, я могу поставить простой:
Против
Второй сегмент использует свойства для управления значением атрибута, но, хотя он использует один из основных принципов объектно-ориентированного программирования, он не имеет смысла, если мы не требуем (или потребуем в будущем) контролировать входы/выходы этого атрибута.
Вам не нужно применять все теоретические концепции, которые вы знаете с первого раза, многие из них вам придется применять по мере развития или масштабирования вашего приложения, увеличения потребностей в управлении, но бизнес-логика подскажет вам, следует ли вам инкапсулировать атрибуты вашего приложения class. Иногда слишком много инкапсуляции приводит к созданию таких монстров кода, как:
Когда это может быть более читабельно, как:
Но, как я уже говорил, какой из них использовать, будет зависеть от бизнес-логики вашего приложения.
Да, есть веские причины для их использования, хотя их не следует считать абсолютно необходимыми. Если вы объявляете переменную (или поле ) общедоступной, вы разрешаете прямой доступ к ее содержимому без каких-либо мер контроля. Во многих случаях это не должно быть проблемой, но с растущей системой это может быть.
Реализация методов для доступа к переменной дает вам возможность в любой момент добавить код, управляющий доступом к переменной, без необходимости изменять интерфейс вашего класса. Я привожу вам пример.
Рассмотрим этот класс:
по сравнению с версией с
get
иset
В какой-то момент мы понимаем, что должны гарантировать, что никогда не останется ни имени, ни фамилии
null
.С первым классом это практически невозможно,
persona.nombre = null;
мы ничего не можем запретить. Однако в другой версии есть очень простой способ:и мы получаем исключение, если кто-то пытается установить значение null.
Более практичным примером может быть реализация временной метки для резервного копирования данных обновления. Без геттеров и сеттеров нам пришлось бы обязательно проверять весь код, в котором поля могут быть изменены. Практика использования сеттеров по умолчанию позволяет нам упростить путь:
Таким образом реализовать эту функциональность можно было только в модели в классе.
Напротив, парадигма, в которой геттеры и сеттеры полностью избыточны, — это неизменяемые ВО (объекты-значения, объекты-значения). Пример:
В этом случае геттеры или сеттеры были бы совершенно бессмысленными.
Как видите, да, причины есть, но все зависит от дизайна и контекста.
Gets — это выходы, а Sets — это входы класса. Считается хорошей практикой реализовывать их в основном из соображений безопасности , поскольку мы максимизируем инкапсуляцию.
Мы изолируем фактическое представление данных и будем иметь доступ только к поведению.