Um ein Format zu definieren, wird eine TL- Schnittstelle ConfigurationValueProvider implementiert, da Implementierungen der Java-Standard-Klasse java.text.Format nicht thread-sicher sind. Pro Parse-Vorgang müsste daher eine eigene Instanz von Format angelegt werden. Dies hätte zur Folge, dass statt eines Formates, ein Format-Provider annotiert werden müsste.
Eigene Formate für eigene Typen können also am einfachsten als Ableitung von AbstractConfigurationValueProvider erstellt und entweder an ein konkretes Property oder an den selbstdefinierten Werte-Typ annotiert werden.
Um eine Liste von java.lang.Enum zu konfigurieren, kann man eine der bereits existierenden Ableitungen von CommaSeparatedEnum benutzen, z.B. CommaSeparatedMonths, oder eine eigene folgendermaßen definieren:
@Format(CommaSeparatedMyEnums.class)
List<MyEnum> getMyEnums();
public static class CommaSeparatedMyEnums extends CommaSeparatedEnum<MyEnum> {
public static final CommaSeparatedMyEnums INSTANCE = new CommaSeparatedMyEnums();
private CommaSeparatedMyEnums() {
super(MyEnum.class);
}
}
Für Unterkonfigurationen kann ebenfalls ein @Format angegeben werden, um zu erlauben, dass eine Unterkonfiguration (z.B. in häufig vorkommenden einfachen Fällen) direkt als Attribut statt über ein Sub-Tag konfiguriert werden kann (vgl. XML-Binding).
Das Format wird nur verwendet, wenn der Wert in einem Attribut angegeben ist, oder das Konfigurationelement Non-White-Space-Content als Inhalt hat.
Eine Konfiguration für den Typ MainConfig, der wie folgt definiert ist
interface MainConfig extends ConfigurationItem {
SubConfig getSubConfig();
}
interface SubConfig extends ConfigurationItem {
int getX();
int getY();
}
wird in XML standardmäßig wie folgt geschrieben werden:
<main-config>
<sub-config x="13" y="42"/>
</main-config>
Für die Unterkonfiguration SubConfig kann aber ein Format angegeben werden, das eine kürzere Konfiguration erlaubt:
@Format(PointFormat.class)
interface SubConfig {
int getX();
int getY();
}
bzw. an der Eigenschaft
interface MainConfig extends ConfigurationItem {
@Format(PointFormat.class)
SubConfig getSubConfig();
}
Wenn das Format PointFormat (als Unterklasse von AbstractConfigurationValueProvider) einen String der Bauart "13,42" in eine Instanz von SubConfig mit entsprechenden Properties übersetzt, lässt sich obige Konfiguration kürzer schreiben, z.B.:
<main-config sub-config="13,42"/>
oder
<main-config>
<sub-config>13,42</sub-config>
</main-config>
Insbesondere bei komplexen Ausdrücken, für die eine "echte", eigens definierte Domain-Specific-Language (DSL) definiert ist, eignet sich die letzte Form der Eingabe.