Как соотносится дизайн JavaBeans с сокрытием информации? - PullRequest
2 голосов
/ 09 сентября 2009

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

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

Ответы [ 4 ]

1 голос
/ 10 сентября 2009

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

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

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

1 голос
/ 09 сентября 2009

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

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

0 голосов
/ 09 сентября 2009

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

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

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

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

0 голосов
/ 09 сентября 2009

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

...