Seit mit JDK 1.5 (aka Java2 Version 5 (Kopfschüttel)) Annotations eingeführt wurden, wurden viele XML Dateien durch Annotations ersetzt. Prinzipiell sind Annotations auch eine feine Sache, aber bei der ganzen Begeisterung für die (nicht mehr so ganz) neue Technologie schiesst man leicht über das Ziel hinaus. Falls euch das noch nicht passiert ist, dann ist dieser Artikel für euch. Falls doch, könnt ihr zusammen mit mir in Erinnerungen schwelgen.

Das Schöne an Annotations ist, das sie Teil der Java Sprache sind und mit übersetzt werden, dementsprechend gibt es Compiler Fehler wenn man zu großen Murcks macht. Nehmen wir zum Beispiel an, wir wollen per Konfiguration zu einer Property einer Klasse definieren, was für eine Art Filter für die Suche nach diesem Attribut verwendet werden kann.

Mit XML könnte das so aussehen:




Vertippt man sich dabei bei einem der beiden enthaltenen Klassennamen hat man verloren und wird erst zur Laufzeit mit Fehlermeldungen bombardiert. Mit Annotations geht das viel besser:

public class Person{
@Filter(theClass= de.schauderhaft.LikeFilter)
public String getName(){ ...
}
}

Für die Person muss der Klassenname nicht noch einmal angegeben werden, da wir uns ja in eben dieser Klasse befinden. Auch die Zuordnung zu der Property ist allein dadurch klar, dass die Annotation eben am Getter steht. Und der Klassenname der Filterklasse? Wenn der falsch geschrieben ist, meckert der Compiler, und besser, man schreibt ihn garnicht erst falsch, da er per autocompletion entsteht. Aber ist das wirklich das gelbe vom Ei?

Die Probleme werden offensichtlich, wenn man versucht die Person-Klasse außerhalb des ursprünglich vorgesehenen Kontexts zu verwenden. Erstens: die Filter Annotation ist im Zweifelsfall nicht bekannt, da sie Teil eines speziellen Frameworks ist. Zweitens, die Klasse  de.schauderhaft.LikeFilter ist ebenfalls nicht bekannt. Mit ein wenig Sorgfalt und wenigen einfachen Regeln lassen sich aber beide Probleme in den Griff bekommen.

  1. Wenn ihr ein Framework baut, welches eigene Annotations nutzt, macht die Annotations als kleines JAR separat verfügbar. So können Klassen mit den Annotations versehen werden und vergrößern den Classpath nur geringfügig. Und wenn die Annotations gut entworfen sind, dann behalten sie einen großen Teil ihrer Aussagekraft. Und können auch außerhalb ihres ursprünglich geplanten Einsatzsgebietes verwendet werden.
  2. Ãœberlegt euch gut, ob ihr wirklich Klassen als Parameter von Annotations verwendet. Die sind zwar charmant, aber sie machen die annotierte Klasse abhängig von der Klasse, die als Parameter angegeben wurde. In vielen Fällen geht dies Abhängigkeit in die falsche Richtung, in dem obigen Beispiel von der Model Schicht in die GUI Schicht. Ein String, ein Enum, oder wenn es denn vom Typ Class sein soll, ein Interface sind oft die bessere Wahl. Sie transportieren auf abstakte Weise Informationen, ohne festzulegen, wie diese verwendet werden sollen. Im Beispiel: Nach dem Namensattribut soll Like Syntax gesucht werden, unabhängig davon, ob daraus eine Eingabebox in einem Webdialog, einer Swingmaske, oder ein Argument eines Webservices wird.