読者です 読者をやめる 読者になる 読者になる

アノテーション

アノテーションの構文は結構独特で、触ったことのない人はソースをみると困惑すると思う。


まず、手始めにこんなアノテーション

public @interface Hoge {
     int value() default 0;
}

・・・これはJavaなのか?いや、Javaですよ?


アノテーション@interfaceと宣言する。まぁ、一種のインターフェイスであることには違いないが、専用のキーワードを用意しても良かったんじゃないかな、とも思う。少なくとも日本人にはannotationなんて名前付けるような人はいない気が*1・・・自然言語処理の分野では使うらしい。予約語の追加 - odz buffer
で、int value()まではいいだろう。問題はdafault 0だ。
これは、アノテーションHogeのvalueキーのデフォルト値として、0を設定する、という意味だ。これを使う側は次のように記述する。

@Hoge(value=2)
public class Test1 {}

valueは特別なキーで、代入が省略出来るので、

@Hoge(2)
public class Test1 {}

のように書くことも出来る。このとき、デフォルト値があるのでそれを使うなら以下のように出来る。

@Hoge()
public class Test2 {}

更に括弧を省略して、

@Hoge
public class Test2 {}

のようにすることも出来る。


今度のアノテーションはもっとすごい。

public @interface Piyo {
    String[] value() default {}
}

・・・あれ?インターフェイスなのにメソッド本体があるぞ?しかもreturnしてないし・・・
と、感じてしまっても無理はない。でも、これは全然違う意味を持つ。さっきの例で見たように、defaultはそのキーのデフォルト値を表す。ということは、{}String[]のデフォルト値ということである。つまり、長さ0の配列がデフォルト値ということ。
new String[0]とでも書かせて欲しいところだが、デフォルト値には定数しか許されないので、このようになるのだ。


まぁ、一回見とけば次見たときにそんなに驚かなくなるだろう。とは言っても、アノテーションを普通のプログラマが作ったり中身見たりすることはあまりないだろうけど。

*1:全くの偏見です