AgE 2.7 : MonitorowanieZmian

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

(tick)

 

 

Zmiana właściwości A

(tick)

(tick)

 

Zmiana właściwości B

(tick)

(tick)

(tick)