Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java1_2013_2014 / java9.pptx
Скачиваний:
130
Добавлен:
16.04.2015
Размер:
124.79 Кб
Скачать

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

Соседние файлы в папке java1_2013_2014