
- •JAVA-ТЕХНОЛОГИЯ
- •Java Beans - шаблоны проектирования свойств
- •Свойства Java Beans: сравнение с .NET
- •Java Beans:
- •Связываемые свойства (bound properties)
- •PropertyChangeEvent – передача информации о событии
- •Свойства с ограничениями (constrained properties)
- •VetoableChange – изменение свойства с ограничениями
- •Пример: Связываемое свойство с ограничениями (1 / 4 )
- •Пример: связываемое свойство с ограничениями (2 / 4)
- •Пример: связываемое свойство с ограничениями ( 3 / 4 )
- •Пример: связываемое свойство с ограничениями ( 4 / 4 )
- •Java Beans: спецификация, настройка, редактирование свойств и анализ

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики, руководитель лаборатории Java- технологии (http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 9

Java Beans - шаблоны проектирования свойств
Свойства Java Bean – простые, булевские и индексируемые;
пусть N – имя свойства
Простые свойства (T – тип свойства: int, double и т.д.) :
public T getN() - взять значение свойства
public void setN(T newValue) – изменить значение свойства (если метод вида setN отсутствует, свойство – константное)
Булевские свойства: к шаблону добавляется метод вида isN public boolean isN() – проверка истинности значения свойства public boolean getN() – взять значение свойства
public void setN(boolean newValue) – изменить значение свойства
Индексируемые свойства (тип элемента – T, тип индекса – int):
public T getN(int index);
public void setN(int index, T newValue)
public T[] getN() – взять массив значений свойства
public void setN (T[] newValues) – изменить массив значений
(C) В.О. Сафонов. 2013

Свойства Java Beans: сравнение с .NET
Java: концепция property введена на уровне соглашения о проектировании и разработке API
.NET: концепция property введена в общую систему типов (CTS) .NET и в язык C#.
В языке C# свойство определяется парой методов get и set – “обобщенными считыванием (вычислением) и присваиванием” значения свойства. Синтаксический сахар: obj.Prop = V;
C#: свойства-индексаторы – аналог индексируемых свойств в Java; Синтаксический сахар: obj[ind] = V;
(C)В.О. Сафонов. 2013

Java Beans:
Шаблоны проектирования событий
Java Beans могут генерировать события и сообщать о них зарегистрированным слушателям этих событий
Шаблоны проектирования событий (My – имя события) :
public void addMyListener(MyListener el) – регистрация слушателя события (при произвольном возможном числе слушателей)
public void addMyListener(MyListener el) throws TooManyListenersException – регистрация слушателя события (при ограниченном числе слушателей, например, равном 1)
public void removeMyListener(MyListener el)
Java Bean, генерирующий событие вида My, должен реализовывать методы по данному шаблону, а класс- слушатель события My должен их использовать
Инструмент построения приложений обеспечивает связывание bean-генератора событий с bean-слушателем события во время проектирования Java-приложения
(C)В.О. Сафонов. 2013

Связываемые свойства (bound properties)
Связываемое свойство – изменение его значения генерирует событие, которое можно связать с его слушателями
Имя события “изменение свойства” – PropertyChange; т.е. для обеспечения возможности обработки такого события bean должен определять пару методов следующего вида:
public void addPropertyChangeListener(PropertyChangeListener p) –
регистрация слушателя события “изменение свойства”; здесь
PropertyChangeListener – интерфейс (из пакета java.beans), который должен реализовываться каждым слушателем
public void removePropertyChangeListener
(PropertyChangeListener p) – отмена регистрации слушателя события “изменение свойства”
Java bean должен нотифицировать слушателей о наступлении события “изменение свойства” , вызывая для каждого зарегистрированного слушателя реализованный им метод
PropertyChange(PropertyChangeEvent e);
здесь PropertyChangeEvent – (объект-) информация о событии
Возможно (но не обязательно) использовать сервисный класс
PropertyChangeSupport |
(C) В.О. Сафонов. 2013 |
|

PropertyChangeEvent – передача информации о событии
Вызов конструктора:
e = new PropertyChangeEvent
(source, propName, oldValue, newValue);
где:
-source – ссылка на объект-источник события (как правило, this)
-propName – имя свойства; например: “Red”
-oldValue – старое значение свойства; например, false
-newValue – новое значение свойства; например, true
Нотификация слушателя о наступлении события PropertyChange:
aListener.propertyChange(e);
где: aListener – (очередной) слушатель; e – событие
Анализ события слушателем (реализация метода propertyChange):
getPropertyName() , getNewValue() , getOldValue();
в свою очередь, bean-слушатель также может сгенерировать свое собственное событие класса PropertyChangeEvent, и т.д.
(C) В.О. Сафонов. 2013

Свойства с ограничениями (constrained properties)
Свойство с ограничениями – это свойство, на изменение которого слушатели могут накладывать вето (в случае, если изменение некорректно)
Для свойства с ограничениями шаблон проектирования – несколько иной (например, для простого свойства) :
public T getN() – взять значение свойства
public void setN(T newValue) throws PropertyVetoException –
изменить значение свойства; если изменение некорректно, слушатель бросает исключение класса
PropertyVetoException
Для передачи информации о событии “изменение свойства с ограничениями” используется специальный интерфейс
VetoableChangeListener
(C) В.О. Сафонов. 2013

VetoableChange – изменение свойства с ограничениями
Генератор события реализует пару методов:
public void addVetoableChangeListener (VetoableChangeListener x) –
регистрация слушателя события “изм.свойства с ограничениями”
public void removeVetoableChangeListener (VetoableChangeListener x) –
отмена регистрации слушателя события
При наступлении события генератор формирует объект класса PropertyChangeEvent (e) и передает его всем слушателям, вызывая для каждого из них (p) метод: p.vetoableChange (e);
Слушатель события реализует интерфейс VetoableChangeListener, то есть метод: vetoableChange(PropertyChangeEvent e), в котором выполняет обработку события (аналогично propertyChange); для накладывания “вето” – бросает PropertyVetoException
Возможно (но не обязательно) использовать дополнительный сервисный класс VetoableChangeSupport для поддержки обработки свойств с ограничениями
Возможна двухэтапная обработка такого события:
VetoableChange (только проверка); PropertyChange (обработка)
(C) В.О. Сафонов. 2013

Пример: Связываемое свойство с ограничениями (1 / 4 )
import java.beans.*;
public class BudgetBean { // бюджет с ограничениями private int budget = 1;
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
//слушатели изменений – сотрудники private VetoableChangeSupport vetos =
new VetoableChangeSupport(this);
//контролеры изменений – начальники public BudgetBean(int aBudget) // конструктор
{
budget = aBudget;
}
(C) В.О. Сафонов. 2013

Пример: связываемое свойство с ограничениями (2 / 4)
public int getBudget() // взять значение свойства { return budget; }
pubic void setBudget(int newBudget) throws PropertyVetoException { // установить значение свойства
int oldBudget = budget; vetos.fireVetoableChange
(“Budget”, new Integer(oldBudget), new Integer(newBudget)); // проверка нового значения
budget = newBudget; // установка нового значения changes.firePropertyChange
(“Budget”, new Integer(oldBudget),
new Integer(newBudget)); // нотификация об установке значения } // setBudget
(C) В.О. Сафонов. 2013