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 |
|
|
|