Definiowanie właściwości
Własności można definiować w klasach, które implementują interfejs IPropertyContainer
. Jego domyślna implementacja, klasa ClassPropertyContainer
, która jest klasą bazową m.in. dla wszystkich agentów, umożliwia dwa sposoby definiowania właściwości.
Oznaczanie pola jako właściwości
Aby oznaczyć pole jako właściwość, należy użyć adnotacji @PropertyField
. Przyjmuje ona dwa argumenty - obowiązkowy propertyName
, nadający właściwości nazwę oraz opcjonalny isMonitorable
, informujący, czy może one być monitorowana (argument ten ma domyślną wartość true
). Wartości wszystkich właściwości zdefiniowanych w ten sposób mogą być zapisywane.
Przykład oznaczenia pola jako właściwości jest przedstawiony poniżej:
@PropertyField(propertyName = "echoStr", isMonitorable = true) private IEchoStrategy echoStr;
Definiowanie właściwości przez adnotację pól jest proste, i powinno być stosowane zawsze tam, gdzie właściwości odpowiadają bezpośrednio polom klasy.
Oznaczanie metod odczytujących i modyfikujących właściwości
Właściwość może być definiowana przez dwie metody: zwracającą (getter) oraz modyfikującą (setter) jej wartość; jeżeli metoda modyfikująca nie jest zdefiniowana, właściwość jest tylko do odczytu. Metody zwracające i modyfikujące mogą mieć dowolne nazwy, jednak muszą być oznaczone odpowiednimi adnotacjami: @PropertyGetter
oraz @PropertySetter
. Pierwsza z nich, oprócz nazwy właściwości, przyjmuje także argument isMonitorable
, który informuje o tym, czy właściwość może być monitorowana. Drugi z nich (@PropertySetter
), podobnie jak @PropertyField
.
Przykład definicji właściwości przy pomocy pary metod znajduje się poniżej:
@PropertyGetter(propertyName="intProperty", isMonitorable=true) public int getIntProperty() { return _intProperty + 1; } @PropertySetter(propertyName="intProperty") public void setIntProperty(int value) { int oldValue = _intProperty; _intProperty = value - 1; notifyPropertyChanged("intProperty", oldValue) }
Metody notifyPropertyChanged(...)
, której wywołanie jest widoczne w metodzie ustawiającej wartość, jest zdefiniowana w klasie ClassPropertyContainer
i służy do powiadomienia odpowiednich monitorów o zmianie wartości właściwości. Jej użycie jest też konieczne w przypadku użycia adnotacji pola, kiedy pole to jest zmieniane bez udziału mechanizmu właściwości.
Wszystkie klasy, które dziedziczą z klasy ClassPropertiesContainer
, powinny w konstruktorze wywołać metodę initializeProperties
.
Prawidłowe nazwy
Nazwy właściwości mogą być dowolnym ciągiem znaków, nie zawierającym następujących znaków: '.', '[', ']', ',', '*', '@'. Wymagania te są związane z budową ścieżek dostępu do złożonych właściwości oraz wzorców argumentów funkcji, omówionych w dalszej części.