8.7 Annotationen
 
In Java 5.0 gibt es eine in die Programmiersprache eingebaute Fähigkeit für Metadaten: Annotationen. Das folgende Beispiel zeigt einen denkbaren Einsatz für WebServices.
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.
8.7.1 Die eingebauten Annotations-Typen aus java.lang
 
Oft haben wir schon Anwendungen vom Annotations-Typ @Override gesehen. Die Annotations-Typen sind die Definition und werden an ein Element gehängt; dann ist es eine konkrete Annotation. Während also @Override selbst der Annotations-Typ ist, ist @Override vor toString() die konkrete Annotation.
Neben @Override gibt es in Java 5 noch drei weitere im Paket java.lang definierte Annotationen und weitere vier, die für eigene Annotations-Typen interessant sind. Fassen wir die ersten zusammen, die vom Compiler beziehungsweise Laufzeitsystem besonders beachtet werden und eine eigene Semantik haben.
@Override
|
Zeigt an, dass die annotierte Methode eine Methode aus der Oberklasse überschreibt.
|
@Deprecated
|
Das markierte Element ist veraltet und sollte nicht mehr verwendet werden.
|
@SuppressWarnings
|
Bestimmte Compiler-Warnungen sollen unterdrückt werden.
|
Tabelle 8.5
Vordefinierte Annotationen aus dem Paket java.lang
8.7.2 @Deprecated
 
Die Annotation @Deprecated übernimmt die gleiche Aufgabe wie das javaDoc-Tag @deprecated. Ein Unterschied bleibt: Das javaDoc-Tag kann nur vom javaDoc (beziehungsweise einem anderen Doclet) ausgewertet werden, während Annotationen auch andere Tools selbst zur Laufzeit auswerten können.
@Deprecated
public void fubar() { ... }
Falls die @Deprecated Methode fubar()1
genutzt wird, gibt es eine einfache Meldung. Die Übersetzung mit -Xlint:deprecation liefert die genauen Warnungen; im Moment ist das mit -deprecation gleich.
8.7.3 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üsse/Werte-Paaren
|
8.7.4 @SuppressWarnings
 
Die Annotation @SuppressWarnings steuert Compiler-Warnungen. Unterschiedliche Werte bestimmten 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.
Beispiel Der Compiler soll für die ungenerisch verwendete Liste keine Meldung geben.
Listing 8.15
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.
1 Auch aus dem Milität: »Fucked up beyond any recognition«.
|