前回までJava SE 9の機能であるProject Jigsawについて紹介してきましたが、今月から再びJava SE 8の機能に戻りましょう。
Java SE 8では、Project LambdaやDate&Time APIに隠れて目立ちませんが、アノテーションにも手が入れられました。アノテーションが導入されたのはJ2SE 5のときです。Java SE 8での拡張は、それ以来の大きなものとなっています。
Java SE 8でのアノテーションの拡張点を以下に示します。
- aptの廃止
- 複数記述可能なアノテーション
- 標準アノテーションの追加
- 型アノテーションの導入
aptはアノテーションを解釈するためのツールでしたが、現在はAnnotation Processing APIに置きかえられています。既にJava SE 7リリース時に、aptはJava SE 8で廃止予定と発表されていたので、大きな混乱はないはずです。
本記事では、次の複数記述可能なアノテーションと追加された標準アノテーションについて紹介します。
そして、Java SE 8での最も大きな拡張が、最後の型アノテーションの導入です。型アノテーションについては、次回から紹介する予定です。
複数記述可能なアノテーション
アノテーションは変数やメソッドなど対象を修飾し、情報を付加することができます。
例えば、クラスを修飾する@Characteristicというアノテーションがあったとします。また、@Characteristicアノテーションは値を1つ持てるとしましょう。
@Characteristicアノテーションの使用例をリスト1に示しました。
リスト1●@Characteristicアノテーションの使用例
@Characteristic("Singleton")
public class Facade {
… 省略 …
}
リスト1では@Characteristicアノテーションを使用して、Facadeクラスがシングルトンであることを示しています。
通常、リスト1のようにある対象に対して、同じアノテーションは1回しか記述することができません。しかし、複数の情報を記述したいこともあるはずです。
リスト1ではシングルトンであることを示しましたが、それと同時にリードオンリーであることも記述したいというような場合です。
Java SE 7までは、同じアノテーションを複数回記述することはできないため、配列の要素を持つアノテーションで代用していました。
例えば、配列要素を持つ@Characteristicアノテーションの定義をリスト2に示しました。
リスト2●@Characteristicアノテーションの定義
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Characteristic {
String[] value();
}
リスト2のように@Characteristicアノテーションを定義した場合、シングルトンとリードオンリーであることを示すにはリスト3のように記述できます。
リスト3●複数情報の付記
@Characteristic({"Singleton", "ReadOnly"})
public class Facade {
… 省略 …
}
これはこれで問題ありませんが、より柔軟に記述したいところです。そこで、Java SE 8からは同じアノテーションを複数記述できるようになりました。