Default-Werte

Es besteht die Möglichkeit, einen Default Wert für eine Property anzugeben. Dafür muss man an das entsprechende Property eine Konstante annotieren.

public interface Config extends ConfigurationItem {
  @IntDefault(17)
  int getOption();
}

Wenn dann aus einer unausgefüllten XML-Datei​

<config option=""/>

​eine neue Instanz der Konfiguration Config erstellt wird, liefert der Aufruf von getOption() den Wert 17 zurück.

Je nach Typ (primitiv oder Objekttyp), gibt es verschiedene Annotationen für die Eigenschaft:

Primitiv Objekttyp Default-Wert
(siehe Nullable-Annotationen)
Default-Annotationen
boolean Boolean false @BooleanDefault
char Character   @CharDefault
byte Byte 0 @ByteDefault
short Short 0 @ShortDefault
int Integer 0 @IntDefault
long Long 0 @LongDefault
float Float 0.0 @FloatDefault
double Double 0.0 @DoubleDefault
  String "" @StringDefault
  Class   @ClassDefault
  Enum erster Eintrag @ComplexDefault
  Klasse null @ComplexDefault,
@InstanceDefault,
@FormattedDefault,
@ItemDefault
Konfiguration ConfigurationItem null   @FormattedDefault,
@ItemDefault
PolymorphicConfiguration   @ImplementationClassDefault

Für weiterführende Informationen siehe Links in der Tabelle oben und die Abschnitte unten.

Default Werte für Unterkonfigurationen

Der Default @ItemDefault kann für Properties genutzt werden, die eine Unterkonfiguration beschreiben. Statt dem null Default erhält das Property eine Instanz seines Konfigurationtyps oder des in der Annotation angegebenen Konfigurationstyps, der ein Untertyp des Konfigurationstyps des Properties sein muss. 

  • @ItemDefault: Der Default ist eine Instanz des deklarierten Konfigurationsinterface Typs.
  • @ItemDefault(MyConfig.class) und MyConfig ist ein Konfigurationsinterface: Der Default ist eine Instanz von MyConfig.
  • @ItemDefault(MyImpl.class) und MyImpl ist kein Konfigurationsinterface: Der Default ist eine PolymorphicConfiguration mit MyImpl.class als Implementierungsklasse (siehe auch #22219).

Weitere Annotationen

Der Default-Wert einer Property kann entsprechend des Typs des Properties über eine der folgenden Annotationen bestimmt werden:

  • @NullDefault: Der Default-Wert ist null und das Property wird implizit mit @Nullable annotiert.
  • @ClassDefault: Das Property muss vom Typ Class sein und bekommt die annotierte Klasse als Default.
  • @InstanceDefault: Die annotierte Klasse wird instanziert. Eventuell muss man dafür auch InstanceFormat annotieren (siehe Instanzen als Konfigurationswerte).
  • @FormattedDefault: Ist an der Property ein Format annotiert, wird der Default-Wert in der Annotation als String-Wert im gleichen Format angegeben.
    @Format(CommaSeparatedStrings.class)
    @FormattedDefault("orange,apple,banana")
    List<String> getFruits();

     

  • @ItemDefault: Das Property hat selbst einen Konfigurationstyp. Statt dem null Default erhält das Property eine Instanz seines Konfigurationtyps oder des in der Annotation angegebenen Konfigurationstyps, der ein Untertyp des Konfigurationstyps des Properties sein muss. 
  • @ImplementationClassDefault: Für Properties vom Typ PolymorphicConfiguration. Setzt für das Property PolymorphicConfiguration.getImplementationClass() die gegebene Klasse als Default. Wenn es ohne ItemDefault verwendet wird, ist die PolymorphicConfiguration aber per Default trotzdem null. Nur wenn das Property in der Konfiguration erwähnt wird, hat ImplementationClassDefault einen Effekt. Daher wird ImplementationClassDefault häufig zusammen mit ItemDefault verwendet.​​
    @ItemDefault
    @ImplementationClassDefault(SportCar.class)
    PolymorphicConfiguration<? extends Car<?>> getCar();

Spezialfall: Implementierungsklasse einer PolymorphicConfiguration

Der Default-Wert für das spezielle Konfigurationsproperty class in PolymorphicConfiguration wird neben der Methode über @ClassDefault (siehe oben) über den Typ-Parameter T des Konfigurationsinterfaces PolymorphicConfiguration<T> angegeben. Dieser Typ-Parameter bezeichnet den statischen Typ der Implementierungsklasse, welche bei der Instanziierung der Konfiguration erzeugt werden soll.

Die Default-Implementierungsklasse der folgenden Konfiguration ist die Klasse A, ohne dies explizit an das (geerbte) Konfigurationsproperty class zu annotieren.

public interface Config extends PolymorphicConfiguration<A> {
   ...
}

Diese Deklaration ist äquivalent mit:

public interface Config extends PolymorphicConfiguration<Object> {
   @Override
   @ClassDefault(A.class)
   Class<? extends A> getImplementationClass();
}