2️⃣

アノテーション

2024/05/27に公開

概要

「Java SE 11 Programmer II (1Z0-816-JPN) 試験」の出題範囲「アノテーション」の自己学習メモになります

よく使用されるJavaアノテーション

アノテーション名 説明
@Override スーパークラスのメソッドをオーバーライドすることを示す
@FunctionalInterface 関数型インターフェースであることを示す
@Deprecated 非推奨の要素であることを示す
@SuppressWarnings コンパイラの警告を無効にする
@SafeVarargs 安全でない可変長引数に対する警告を無効にする

@FunctionalInterface

要件

  • 単一の抽象メソッドをもつインタフェースとする
  • staticメソッドやdefaultメソッドは定義可能
  • java.lang.Objectクラスのpublicメソッドは抽象メソッドとしての宣言は可能
  • 関数型インタフェースとして明示する場合は、@FunctionalInterfaceを付与する
@FunctionalInterface
interface FuncIter<T> {
    boolean equals(Object obj);
}

@Deprecated

@Deprecated
public Date(String s)

@SuppressWarnings

警告の名前

説明
unchecked List<String>の代わりにListを使用など、型の使用に関連する警告を抑制する
deprecation @Deprecationアノテーションがつけられたタイプまたはメソッドに関連する警告を抑制する
public class Main {
    // @SuppressWarnings(value = {"unchecked", "deprecation"})
    // @SuppressWarnings({"unchecked", "deprecation"})
    public static void main(String[] args) {
        // @Deprecatedが付与されたコンストラクタの利用
        Date date = new Date("2024/05/24");

        // <>による型が未指定
        list list = new ArrayList();
    }
}

@SafeVarargs

public class Main {
    public static void main(String[] args) {
        method(new ArrayList<String>());
    }

    @SafeVarargs
    // @SuppressWarnings("deprecation")
    static void method(List<String>... stringLists) {
        System.out.println(stringLists);
    }
}

7行目の@SuppressWarnings("deprecation")でも警告を抑制できますが、@SafeVarargsは抑制対象メソッドの呼び出し元の警告まで抑制します

カスタムアノテーション

public @interface MyAnnot {
}

アノテーションのアノテート

アノテーション名 説明
@Documented JavaDoc API ドキュメントの出力にも反映させる
@Target アノテーションを付与する要素を限定する
@Retention アノテーションをソースコードもしくはクラスファイルまで保持するかなどを制御する
@Inherited サブクラスにアノテーションを引き継ぐことを示す
@Repeatable 同じ場所に複数回適用する

@Target

@Target(ElementType.METHOD) // メソッドのみに付与
public @interface MyAnnot {
}

ElementType 列挙型の定数

定数名 説明
TYPE クラス、インタフェース、enum
FIELD フィールド
METHOD メソッド
PARAMETER メソッドパラメータ
CONSTRUCTOR コンストラクタ
LOCAL_VARIABLE ローカル変数
ANNOTATION_TYPE メタアノテーション
PACKAGE パッケージ
TYPE_PARAMETER 型パラメータ
TYPE_USE
MODULE モジュール

@Retention

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnot {
}
定数名 説明
SOURCE アノテーションはコンパイラによって破棄される
CLASS アノテーションはコンパイラによってクラスファイルには記録されるが、実行時にVMによって無視される
RUNTIME アノテーションはコンパイラによってクラスファイルに記録され、実行時にVMによって読み取られる

@Inherited

@Repeatable

@MyAnnot("test1")
public class Foo() {
    @MyAnnot("test2")
    @MyAnnot("test3")
    public void method(int a) {
    }
}

Discussion