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)undMyConfigist ein Konfigurationsinterface: Der Default ist eine Instanz vonMyConfig.@ItemDefault(MyImpl.class)undMyImplist kein Konfigurationsinterface: Der Default ist einePolymorphicConfigurationmitMyImpl.classals 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 istnullund das Property wird implizit mit @Nullable annotiert.@ClassDefault: Das Property muss vom TypClasssein und bekommt die annotierte Klasse als Default.@InstanceDefault: Die annotierte Klasse wird instanziert. Eventuell muss man dafür auchInstanceFormatannotieren (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 demnullDefault 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 TypPolymorphicConfiguration. Setzt für das PropertyPolymorphicConfiguration.getImplementationClass()die gegebene Klasse als Default. Wenn es ohneItemDefaultverwendet wird, ist diePolymorphicConfigurationaber per Default trotzdemnull. Nur wenn das Property in der Konfiguration erwähnt wird, hatImplementationClassDefaulteinen Effekt. Daher wirdImplementationClassDefaulthäufig zusammen mitItemDefaultverwendet.
@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();
}