AgE 2.7 : DefiniowanieWlasciwosci

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.