Javaアノテーションタイプ完全ガイド:事前定義・カスタム・メタアノテーション
Javaアノテーションタイプ
Javaアノテーション(事前定義、カスタム、メタ)を明確な例とともに解説します。
Javaアノテーションはソースコードの要素を記述するメタデータです。Java SEプラットフォームには標準アノテーションが用意されており、開発者はプロジェクト固有のカスタムアノテーションを作成できます。アノテーション自体にもアノテーションを付けられ、これをメタアノテーションと呼びます。
アノテーションは3つのカテゴリに分類されます:
- 事前定義アノテーション – Javaプラットフォームに組み込み済み
- カスタムアノテーション – 開発者が特定のニーズ向けに定義
- メタアノテーション – 他のアノテーションに適用されるアノテーション
事前定義アノテーションタイプ
1. @Deprecated
@Deprecatedマーカーは、クラス、メソッド、フィールドなどが廃止予定で、より新しい代替があることを示します。非推奨要素を使用するとコンパイラが警告を出します。
構文:
@Deprecated public void oldMethod() { ... }
Javadocでは@deprecatedタグで文書化します:
/** * @deprecated * Use {@link #newMethod()} instead. */ @Deprecated public void oldMethod() { ... }
例
class Main { /** * @deprecated * This method is deprecated and has been replaced by newMethod() */ @Deprecated public static void deprecatedMethod() { System.out.println("Deprecated method"); } public static void main(String[] args) { deprecatedMethod(); } }
出力
Deprecated method
2. @Override
@Overrideは、メソッドがスーパークラスやインターフェースのメソッドをオーバーライドする意図であることを示します。必須ではありませんが、シグネチャの不一致などをコンパイル時に検出できます。
例
class Animal { public void display() { System.out.println("I am an animal"); } } class Dog extends Animal { @Override public void display() { System.out.println("I am a dog"); } public void printMessage() { display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printMessage(); } }
出力
I am a dog
3. @SuppressWarnings
このアノテーションは、コンパイラに特定の警告カテゴリを無視させます。よく使われるのはdeprecationとuncheckedです。
使い方:
@SuppressWarnings("deprecation")
複数カテゴリ:
@SuppressWarnings({"deprecation", "unchecked"})
例
class Main { @Deprecated public static void deprecatedMethod() { System.out.println("Deprecated method"); } @SuppressWarnings("deprecation") public static void main(String[] args) { Main depObj = new Main(); depObj.deprecatedMethod(); } }
出力
Deprecated method
4. @SafeVarargs
final、static、またはprivateなメソッドおよびコンストラクタに適用し、そのメソッドがvarargsパラメータに対して安全でない操作を行わないことを表明します。これによりvarargs関連の非検査警告が抑制されます。
例
import java.util.*; class Main { @SafeVarargs private static void displayList(List<String>... lists) { for (List<String> list : lists) { System.out.println(list); } } public static void main(String[] args) { List<String> universityList = Arrays.asList("Tribhuvan University", "Kathmandu University"); List<String> programmingLanguages = Arrays.asList("Java", "C"); displayList(universityList, programmingLanguages); } }
出力
[Tribhuvan University, Kathmandu University] [Java, C]
5. @FunctionalInterface
Java 8で導入。インターフェースを関数型インターフェース(抽象メソッドが1つだけのインターフェース)として指定します。コンパイラがこの制約を検証します。
例
@FunctionalInterface public interface MyFuncInterface { void firstMethod(); // abstract }
2つ目の抽象メソッドを追加するとコンパイルエラーになります:
@FunctionalInterface public interface MyFuncInterface { void firstMethod(); void secondMethod(); // compile‑time error }
複数のdefaultやstaticメソッドは許可されます。
@FunctionalInterface public interface MyFuncInterface { void firstMethod(); default void secondMethod() { /* ... */ } default void thirdMethod() { /* ... */ } }
カスタムアノテーション
開発者はアプリケーション固有の要件に合わせたアノテーションを作成できます。構文は@interfaceを使い、要素メソッドにデフォルト値を指定できます。
構文
@interface AnnotationName { ElementType elementName() default defaultValue; }
例
@interface MyCustomAnnotation { String value() default "default value"; } class Main { @MyCustomAnnotation(value = "programiz") public void method1() { System.out.println("Test method 1"); } public static void main(String[] args) { new Main().method1(); } }
出力
Test method 1
メタアノテーション
メタアノテーションは、他のアノテーションの振る舞いを設定します。
1. @Retention
アノテーションの可視性スコープを定義:SOURCE、CLASS、RUNTIME。
@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { }
2. @Documented
生成されるJavadocにアノテーションが含まれるようにします。
@Documented public @interface MyAnnotation { }
3. @Target
アノテーションを適用できるプログラム要素を制限します。
@Target(ElementType.METHOD) public @interface MyAnnotation { }
要素タイプにはANNOTATION_TYPE、CONSTRUCTOR、FIELD、LOCAL_VARIABLE、METHOD、PACKAGE、PARAMETER、TYPEがあります。
4. @Inherited
スーパークラスに付いたアノテーションをサブクラスが継承できるようにします。
@Inherited public @interface MyAnnotation { }
5. @Repeatable
同じ要素に同じアノテーションを複数回付けられるようにします。コンテナアノテーションが必要です。
@Repeatable(Universities.class) public @interface University { String name(); } public @interface Universities { University[] value(); }
使用例:
@University(name = "TU") @University(name = "KU") private String uniName;
実行時にアノテーションデータにアクセスするには、リフレクションAPIのgetAnnotationsByType()またはgetAnnotations()を使用します。
Java
- Javaプリミティブデータ型:例付き完全ガイド
- Java演算子をマスター:種類、構文、実践例
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアノテーションタイプ完全ガイド:事前定義・カスタム・メタアノテーション
- Java String.charAt()完全解説:構文、戻り値、例外、実例
- Java String.endsWith()マスター:文字列サフィックスチェック実例付き
- Java文字列置換マスター:replace()、replaceAll()、replaceFirst()徹底解説
- Java変数の種類:ローカル、インスタンス、クラス変数を徹底解説
- Java修飾子完全ガイド:アクセス/非アクセス修飾子の種類と使い分け