アノテーションについて
アノテーションはクラス、メソッド、フィールドなどにメタデータ(追加情報)を設定することができ、設定した情報はコンパイルや実行時の動作に影響を与えます。
プログラムの動作には直接影響を与えない注釈のようなものです。
コメントとの違いは、コンパイル時に影響を与えたり、
アノテーションから処理を行ったりするという所です。
アノテーションには主に以下3つの目的があります
- コンパイラへの指示
- コンパイル時の挙動を制御できます。例えば@SuppressWarningsアノテーションを使用するとコンパイルで警告が発生したとしても警告メッセージを出さないようにできます。
- ランタイムへの情報提供
- 実行時にプログラムの動作を制御できます。例えばカスタムアノテーションを使用してフレームワークやライブラリに対して特定の処理を行うことができます。
- ビルドツールへの情報提供
- ビルドツールに対してビルドやパッケージングなどの処理方法を指示できます。
※アノテーションはJDK5以降のバージョンで使用できます。
アノテーションの種類
アノテーションには以下2種類があります。
組込みアノテーション | Javaに標準で用意されているアノテーション |
---|---|
カスタムアノテーション | ユーザが独自に作成するアノテーション |
組込みアノテーション
Javaに標準で用意されているアノテーションでそのまま使うことができます。
以下は主要な組み込みアノテーション一覧です。
アノテーション | 意味 |
---|---|
@Override | メソッドが親クラスのメソッドをオーバーライドしていることを示す |
@Deprecated | 非推奨(deprecated)な要素であることを示す |
@SuppressWarnings | 特定の警告を抑制するために使用する |
@FunctionalInterface | 関数型インターフェースであることを示す |
@SafeVarargs | 安全でない可変長引数に対する警告を抑制する (private、final、saticのいずれかの修飾子が指定されたメソッドのみ指定可) Java SE7以降で使用可 |
@Override
- (@Overrideアノテーションサンプル)
-
@Override void method() { //処理 }
@Deprecated
- (@Deprecatedアノテーションサンプル)
-
@Deprecated public void oldMethod() { //処理 }
※ Java9以降では、以下2つの補足情報を指定できます。
補足情報 | 型 | 意味 |
---|---|---|
since | String | 非推奨となったバージョンを指定する |
forRemoval | boolean | true:将来のバージョンで注釈付きプログラム要素を削除することを示す false:注釈つきプログラム要素の使用が推奨されないことを示す(デフォルト) |
- (@Deprecatedアノテーションサンプル<補足情報あり>)
-
@Deprecated(since = "3.5", forRemoval = true) public void oldMethod() { //処理 }
@SuppressWarnings
- (@SuppressWarningsアノテーションサンプル)
-
@SuppressWarnings("deprecation") public static void deprecatedMethod() { //処理 }
@FunctionalInterface
- (@FunctionalInterfaceアノテーションサンプル)
-
@FunctionalInterface interface SampleFunctionalInterface { void doMethod(); }
@SafeVarargs
- (@SafeVarargsアノテーションサンプル)
-
@SafeVarargs static <T> List<T> createList(T... elements) { List<T> list = new ArrayList<>(); for (T element : elements) { list.add(element); } return list; }
カスタムアノテーション
カスタムアノテーションを作成する時は、@interfaceキーワードを使用します。
アノテーション | 意味 |
---|---|
@Retention | アノテーション情報を保持する期間を指定する ※対象はRetentionPolicyの定数で指定する |
@Target | アノテーションを適用する要素を指定する ※対象はElementTypeの定数で指定する |
@Documented | javadocにアノテーション情報反映する |
@Inherited | アノテーションを派生クラスにも継承させる |
@Repeatable | 同じ箇所に複数回適用させる |
定義 | 意味 |
---|---|
TYPE | クラス、インターフェース、列挙型 |
FIELD | フィールド |
METHOD | メソッド |
PARAMETER | メソッドの引数 |
CONSTRUCTOR | コンストラクタ |
LOCAL_VARIABLE | ローカル変数 |
ANNOTATION_TYPE | メタアノテーション |
PACKAGE | パッケージ |
TYPE_PARAMETER | 型パラメータ |
TYPE_USE | 型 |
MODULE | モジュール |
定義 | 意味 |
---|---|
SOURCE | ソースのみ定義されクラスファイルには定義されない |
CLASS | ソースとクラスファイルに定義されるが、実行時はVMに無視される ※デフォルト |
RUNTIME | ソースとクラスファイルに定義され、実行時もVMに読み取られる |
- (例)カスタムアノテーション「MyAnnotation」を定義して使用するサンプル
-
// カスタムアノテーションの定義 import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value(); } // カスタムアノテーションの使用 public class MyClass { @MyAnnotation("カスタムアノテーションの例") public void myMethod() { // メソッドの処理 } }
上記の例では @MyAnnotationというカスタムアノテーションを定義しています。
@Retentionアノテーションと@Targetアノテーションは、アノテーションの動作を指定しています。
コメント