概要
「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