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.
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 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(); 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();
}