アノテーション(Annotation)

アノテーションについて

アノテーションはクラス、メソッド、フィールドなどにメタデータ(追加情報)を設定することができ、設定した情報はコンパイルや実行時の動作に影響を与えます。
プログラムの動作には直接影響を与えない注釈のようなものです。

コメントとの違いは、コンパイル時に影響を与えたり、
アノテーションから処理を行ったりするという所です。

アノテーションには主に以下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つの補足情報を指定できます。

【Deprecatedの補足情報】
補足情報意味
sinceString非推奨となったバージョンを指定する
forRemovalbooleantrue:将来のバージョンで注釈付きプログラム要素を削除することを示す
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の定数で指定する
@Documentedjavadocにアノテーション情報反映する
@Inheritedアノテーションを派生クラスにも継承させる
@Repeatable同じ箇所に複数回適用させる
【ElementType定数】
定義意味
TYPEクラス、インターフェース、列挙型
FIELDフィールド
METHODメソッド
PARAMETERメソッドの引数
CONSTRUCTORコンストラクタ
LOCAL_VARIABLEローカル変数
ANNOTATION_TYPEメタアノテーション
PACKAGEパッケージ
TYPE_PARAMETER型パラメータ
TYPE_USE
MODULEモジュール
【RetentionPolicy定数】
定義意味
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アノテーションは、アノテーションの動作を指定しています。

コメント

タイトルとURLをコピーしました