10.9 Annotationen 

Seit Java 5 gibt es eine in die Programmiersprache eingebaute Fähigkeit für Metadaten: Annotationen. Das folgende Beispiel zeigt einen denkbaren Einsatz für Web-Services.
import javax.jws.WebService; import javax.jws.WebMethod; @WebService public class Calculator { @WebMethod public int add( int x, int y ) { return x + y; } }
Die Annotationen sind Auszeichnungen der Metadaten und beginnen mit einem @-Zeichen, wie auch die JavaDoc-Tags mit einem solchen Zeichen beginnen. (Das @-Zeichen, AT, ist auch eine gute Abkürzung für Annotation Type.) Hinter dem @ steht ein Bezeichner, der im Allgemeinen ein Wie-Wort (für die Linguisten: Adjektiv) sein sollte.
10.9.1 Annotationstypen @Override, @Deprecated, @SuppressWarnings 

Oft haben wir schon Anwendungen vom Annotationstyp @Override gesehen. Daneben gibt es im Paket java.lang zwei weitere Annotationstypen. Zusammengefasst ergeben sich:
@Override |
Die annotierte Methode überschreibt eine Methode aus der Oberklasse oder implementiert eine Methode einer Schnittstelle. |
@Deprecated |
Das markierte Element ist veraltet und sollte nicht mehr verwendet werden. |
@SuppressWarnings |
Unterdrückt bestimmte Compiler-Warnungen. |
Die drei Annotationen haben vom Compiler beziehungsweise Laufzeitsystem eine besondere Semantik. Einige weitere Annotationen, die nur für eigene Annotationstypen gedacht sind, beleuchtet Kapitel 24, »Reflection und Annotationen«, näher.
Begriffe Annotation und Annotationstyp
Die Annotationstypen sind die Deklarationen wie etwa ein Klassentyp. Werden sie an ein Element gehängt, ist es eine konkrete Annotation. Während also Override selbst der Annotationstyp ist, ist @Override vor toString() die konkrete Annotation.
@Deprecated
Die Annotation @Deprecated übernimmt die gleiche Aufgabe wie das JavaDoc-Tag @deprecated. Ein Unterschied bleibt: Das JavaDoc-Tag kann nur von JavaDoc (beziehungsweise einem anderen Doclet) ausgewertet werden, während Annotationen auch andere Tools selbst zur Laufzeit auswerten können.
@Deprecated public void fubar() { ... }
Falls ein Programmstück die @Deprecated-Methode fubar() [Im US-Militär-Slang steht das für: »Fucked up beyond any recognition«.] nutzt, gibt der Compiler eine einfache Meldung aus. Die Übersetzung mit dem Schalter -Xlint:deprecation liefert die genauen Warnungen; im Moment ist das mit -deprecation gleich.
Annotationen mit zusätzlichen Informationen
Die Annotationen @Override und @Deprecated gehören zur Klasse der Marker-Annotationen, weil keine zusätzlichen Angaben nötig (und erlaubt) sind. Zusätzlich gibt es die »Single-Value Annotation«, die genau eine zusätzliche Information bekommt, und eine volle Annotation mit beliebigen Schlüssel-/Werte-Paaren.
@Annotationstyp |
Marker-Annotation |
@Annotationstyp( Wert ) |
Annotation mit genau einem Wert |
@Annotationstyp( Schlüssel1=Wert1, Schlüssel2=Wert2, ... ) |
volle Annotation mit Schlüssel-/Werte-Paaren |
@SuppressWarnings
Die Annotation @SuppressWarnings steuert Compiler-Warnungen. Unterschiedliche Werte bestimmen genauer, welche Hinweise unterdrückt werden. Beliebt ist die Annotation bei der Umstellung von älterem Quellcode mit nicht-typisierten Datenstrukturen, um die Anzahl der Warnungen zu minimieren. Da sich mit Java 5.0 das Klassenformat änderte, gibt der Compiler beim Übersetzen älterer Klassen schnell eine »unchecked«-Meldung aus.
Beispiel Der Compiler soll für die ungenerisch verwendete Liste keine Meldung geben: Listing 10.35 com/tutego/insel/annotation/SuppressWarningsDemo.java, main() @SuppressWarnings( "unchecked" ) public static void main( String[] args ) { |
ArrayList list = new ArrayList();
list.add( "SuppressWarnings" );
} Die Annotation der lokalen Variable funktioniert nicht! |
@SuppressWarnings("unchecked") ist eine Abkürzung von @SuppressWarnings(value= {"unchecked"});. Die zweite Schreibweise macht deutlich, dass ein Feld von Strings übergeben werden kann.
10.9.2 Annotationen für Web-Services 

Unser erstes Beispiel für Annotationen zeigt ihren Einsatz zur Definition von Web-Services. Die Annotationen wurden erstmalig im JSR 181, »Web Services Metadata for the Java Platform«, definiert und sind nun Teil von Mustang. Kapitel 19, »Verteilte Programmierung mit RMI und Web-Services«, beschäftigt sich etwas ausführlicher mit den Annotationen unter dem Paket javax.jws. Des Weiteren sind Annotationen aus einem zweiten JSR 224 eingezogen, der den Titel »Java API for XML-Based Web Services (JAX-WS) 2.0« trägt. Die Annotationen sowie Klassen und Schnittstellen teilen sich das Paket javax.xml.ws.