Annotationen

Man unterscheidet lokale und geerbte Annotationen: leitet z.B. die Konfiguration

public interface CarForSaleConfig extends CarConfig {
  @Override
  @Mandatory
  int getHorsePower();

  @Name("price")
  @Mandatory
  double getPrice();
}

​von​

public interface CarConfig extends ConfigurationItem {
  @Name("hp")
  int getHorsePower();

  @Name("color")
  String getColor();
}

ab, so ist die @Name-Annotation an der Eigenschaft price lokal, während die @Name-Annotation an der Eigenschaft hp geerbt ist.

Wie man im obigen Beispiel sieht, darf eine Eigenschaft prinzipiell mehrere Annotationen kombinieren. Die Wertannotationen

  1. Defaultwert
  2. Container
  3. Derived 
  4. Mandatory
  5. Abstract

verhalten sich anders:

  • ​Jede Property darf nur eine lokale Wertannotation haben. Ausnahme: Die Property darf gleichzeitig eine Defaultwert-Annotation und eine Derived-Annotation haben. In diesem Fall wird der Default-Wert genommen, wenn der Derived-Ausdruck null ergibt. Nur diese beiden Annotationen können gleichzeitig gesetzt sein. Verstößt eine Property gegen diese Regeln, führt die Verwendung des betroffenen ConfigurationItems zu einer Exception. Genauer: Das Erstellen oder Einlesen eines solchen ConfigurationItems schlägt fehl. Auch das Bauen des ConfigurationDescriptors für diesen Typ schlägt fehl.
  • Jede Property darf beliebig viele Wertannotationen erben. Erbt eine Property mehrere Annotationen, wird die obige Priorisierung verwendet. Hierbei kann sich eine Defaultwert-Annotation mit einer Derived-Annotation ergänzen.
  • Wenn eine Property eine oder mehrere Wertannotationen erbt und zusätzlich eine lokale Wertannotation hat, gewinnt die lokale Wertannotation. Hierbei kann eine lokale Defaultwert-Annotation aber durch eine geerbte Derived-Annotation ergänzt werden und umgekehrt.