Monitorowanie zmian wartości właściwości
Monitorowanie pojedynczej właściwości
Monitorowanie pojedynczej właściwości odbywa się przez dodanie do niej monitora (poprzez metodę addMonitor).
public void addMonitor(PropertyMonitor monitor, IPropertyMonitorRule rule)
Drugi z argumentów tej metody służy do przekazania reguły, która decyduje o tym, kiedy monitor jest powiadamiany o zmianie. Aby powiadamiać go zawsze, należy użyć wbudowanej w jAgE domyślnej reguły DefaultPropertyMonitorRule.
Modyfikowanie wartości właściwości zdefiniowanych przez adnotację @PropertyField przy użyciu metody Property.setValue automatycznie powiadamia wszystkie zarejestrowane monitory. W pozostałych przypadkach decyzja o powiadomieniu monitora zależy od użytkownika.
Automatyczne powiadamianie o zmianie stanu właściwości
W niektórych przypadkach, takich jak opisane w dalszej części monitorowanie złożonych właściwości, przydatne jest poinformowanie monitorów nie tylko o zmianie obiektu będącego wartością właściwości, lecz także o jakiejkolwiek zmianie wewnątrz tego obiektu. W tym celu wprowadzony został interfejs IChangesNotifier, który umożliwia informowanie o jakiejkolwiek zmianie stanu obiektu. Wartości, których typy implementują ten interfejs są traktowane przez klasę Property w specjalny sposób, i monitory założone na taką właściwość są powiadamiane także wtedy, gdy obiekt wartość właściwości zgłosi zmianę swojego stanu.
W taki sam sposób monitorowane są także tablice obiektów implementujących interfejs IChangesNotifier. Jednak w tym przypadku, jeżeli jakikolwiek element tablicy zostanie zastąpiony innym, należy powiadomić o tej zmianie poprzez wywołanie metody notifyPropertyChanged klasy ClassPropertyContainer. Rozwiązanie to nie jest bardzo wygodne, jednak jest wymuszone przez brak możliwości śledzenia zmian tablic.
Monitorowanie właściwości złożonych
W przypadku właściwości złożonych, o zmianach powiadamiane są nie tylko monitory założone bezpośrednio na właściwość, która uległa zmianie, lecz także monitory założone na wszystkie właściwości będące przodkami w drzewie. Przykładowo, mamy klasy:
public class GrandparentPropertyContainer extends ClassPropertyContainer {
...
@PropertyField(propertyName="Z")
private ParentPropertyContainer _propertyZ;
}
public class ParentPropertyContainer extends ClassPropertyContainer {
...
@PropertyField(propertyName="A")
private ChildPropertyContainer _propertyA;
}
public class ChildPropertyContainer extends ClassPropertyContainer {
...
@PropertyField(propertyName="B")
private int _propertyB;
}
Mamy także obiekty tych klas:
GrandparentPropertyContainer grandparent = new GrandparentPropertyContainer();
Property propertyZ = grandparent.getProperty("Z");
Property propertyA = grandparent.getProperty("Z.A");
Property propertyB = grandparent.getProperty("Z.A.B");
Poniższa tabela przedstawia, które monitory będą powiadamiane w przypadku zmiany poszczególnych właściwości:
|
Monitor dołączony do właściwości Z |
Monitor dołączony do właściwości A |
Monitor dołączony do właściwości B |
|---|---|---|---|
Zmiana właściwości Z |
|
|
|
Zmiana właściwości A |
|
|
|
Zmiana właściwości B |
|
|
|