Как соотносится дизайн JavaBeans с сокрытием информации?

StackOverflow https://stackoverflow.com/questions/1400910

Вопрос

Два семестра назад у меня был профессор, который сказал:

  

Некоторым из вас было сказано всегда включать методы установки и получения для всех частных переменных экземпляра. Я говорю, что это нарушает сокрытие информации и часто приводит к тому, что инварианты не могут быть применены.

Теперь, это звучит правильно для меня. Но разве включение таких методов установки / получения не является основной частью создания JavaBeans? Если так, то почему? Если нет, что я неправильно понимаю в JavaBeans?

Это было полезно?

Решение

Методы получения и установки не требуются в классе Java Bean. Все, что требуется, - это то, что класс должен быть общедоступным, он должен иметь открытый конструктор без аргументов и должен реализовывать Serializable. Однако для автоматического обнаружения переменных при использовании вашего bean-компонента вы должны предоставить методы получения и установки в соответствии со стандартным соглашением об именах (getVarname, setVarname ...).

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

Другие советы

Возможно, вы захотите прочитать Почему используются методы получения и установки методы злые :

  

Вы можете возразить, сказав: "Но что   о JavaBeans? " Что насчет них? Вы   может, конечно, построить JavaBeans без   добытчики и сеттеры.    BeanCustomizer , BeanInfo и   Классы BeanDescriptor существуют для   именно с этой целью. JavaBean   Специалисты бросили геттер / сеттер   идиома в картину, потому что они   думал, что это будет простой способ   быстро приготовить боб - то, что вы можете   делать, пока вы учитесь, как это сделать   право. К сожалению, никто этого не сделал.

     

Accessors были созданы исключительно как способ   пометить определенные свойства так   UI-программа-строитель или аналог   идентифицировать их. Вы не должны   называйте эти методы сами. Oни   существуют для автоматического использования инструмента.   Этот инструмент использует API самоанализа   в классе Class , чтобы найти методы   и экстраполировать существование   определенные свойства из метода   имена. На практике это   основанная на самоанализе идиома не имеет   Удалось. Это сделало код значительно   слишком сложный и процедурный.   Программисты, которые не понимают данные   абстракция на самом деле называют   аксессоры, и, как следствие,   код менее обслуживаем.

Обычно это довольно просто: вы выставляете сеттеры / геттеры для переменных, которые нужно сделать видимыми извне, и вы не выставляете сеттеры / геттеры для переменных, о которых никто другой не знает.

Ваш профессор прав. Вы не хотите слепо создавать методы получения и установки для всех переменных экземпляра. Вы хотите создать их там, где они необходимы.

Если у вас есть класс BankAccount с переменной экземпляра balance , создание методов получения и установки для него имеет смысл, если вы хотите иметь возможность проверять и устанавливать баланс.

Даже здесь скрывается информация - в форме инкапсуляции реализации. Получатель " double getBalance () " может просто возвращать значение базовой переменной экземпляра, если это double , или может возвращать значение, полученное из BigDecimal , если это выбор реализации для переменной или это может быть вызов удаленного веб-сервиса и возврат результата. Таким образом, метод получения / установки все еще позволяет варьировать реализацию и, таким образом, не нарушает инкапсуляцию (и, соответственно, не делает JavaBeans).

JavaBeans делает для вас определение интерфейса ( getXXX (), setXXX () ) для получения и установки " свойств " атрибутов класса, которые пользователи обычно хотят изучить или изменить , Если в вашем классе есть информация, которая не считается «свойством», нет необходимости раскрывать ее. Например, предположим, что класс BankAccount имеет переменную экземпляра, используемую для проверки снятия средств. Если клиенту не требуется доступ или изменение этого, нет смысла создавать для него метод получения или установки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top