前回まで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からは同じアノテーションを複数記述できるようになりました。