【JavaGold勉強記#17】独自のアノテーションの作成方法編

JavaGold資格取得に向けた勉強記第17回は「独自のアノテーションの作成方法」についてです。

ここではJavaGold資格取得に向けて勉強している駆け出しプログラマーの私がアウトプットの意味も込めて、「独自のアノテーションの作成方法」について紹介させていただきます。

JavaGold資格取得に向けて勉強されている方や、プログラマー初心者の方にとって参考になれば幸いです!

アノテーションとは?

アノテーションは、Javaのソースコードにメタデータを付加するための特殊な形式のマーカーです。これにより、コンパイラや実行時の処理、フレームワークに対して追加の情報を提供できます。

標準的なアノテーションの他に、プロジェクトやライブラリに独自のアノテーションを定義することができます。

独自のアノテーションを定義する

独自のアノテーションを定義するには、@interface キーワードを使用します。

public @interface Loggable {}

以下は、単純なログ出力用のアノテーションの例です。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Loggable {
    String value() default "INFO";
}

この例では、@Loggable アノテーションを定義しています。

@Retention アノテーションは、アノテーションの保持ポリシーを指定し、@Target アノテーションはアノテーションが適用できる要素の種類を指定しています。この場合、@Loggable アノテーションはメソッドに対して適用でき、実行時にも利用可能です。

独自のアノテーションを使用する

定義したアノテーションを使用するには、対象の要素(メソッドなど)にアノテーションを付加します。

public class ExampleClass {

    @Loggable("DEBUG")
    public void performAction() {
        // メソッドの実装
    }
}

この例では、performAction メソッドに @Loggable("DEBUG") アノテーションを追加しています。アノテーションのパラメータ value にはログのレベルが指定されています。

注釈パラメータを扱う場合

アノテーションはプロセッサに値を渡すことができます。アノテーションで扱う値のことを「注釈パラメータ」と呼びます。

アノテーションで注釈パラメータを扱う場合、アノテーション自体がパラメータを持っていることが一般的です。注釈パラメータはアノテーションに関連付けられ、その情報を利用して特定の処理を行ったり、条件に基づいて振る舞いを変更したりすることが可能です。

アノテーションの定義

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value() default ""; // 注釈パラメータの定義
    int priority() default 0;  // 別の注釈パラメータの例
}

上記の例では、MyAnnotation アノテーションを定義し、valuepriority という2つの注釈パラメータを持っています。@Retention アノテーションで RUNTIME を指定することで、これらの情報を実行時に取得できるようにしています。

アノテーションの使用

注釈パラメータで値をプロセッサに渡したい場合は、次の構文のように「注釈パラメータ = 値」の書式で記述します。

@アノテーション名(注釈パラメータ名 = 値 [, 注釈パラメータ名 = 値]...)
public class ExampleClass {

    @MyAnnotation(value = "Custom Value", priority = 2)
    public void annotatedMethod() {
        // メソッドの実装
    }
}

この例では、ExampleClass クラスの annotatedMethod メソッドに MyAnnotation アノテーションを使用しています。注釈パラメータには value に文字列と priority に整数が指定されています。

注釈パラメータが1つの場合

なお、アノテーションに宣言されている注釈パラメータが1つだけで、かつその注釈パラメータ名がvalueである場合、アノテーションが付与されたクラスでは、カッコ「()」の中に注釈パラメータの値だけを記述することができます。

次のコードは、String型を戻すvalueという注釈パラメータを扱えるようにするため、抽象メソッドを追加したアノテーションです。

public @interface SampleValue {
    String value();
}

このSampleValueというアノテーションを使った例が、次のコードです。SampleValueというアノテーションは、valueという名前の注釈パラメータを1つだけ扱います。そのため、このコードのようにカッコの中に値だけを記述できます。

@SampleValue("sample")
public class UseSample {

}

複数の値を渡す場合

複数の値をアノテーションで扱いたい場合は配列を使用します。次のコードは、int配列型の値を戻す注釈パラメータを定義しています。

public @interface ArrayValues {
    int[] data();
}

複数の値を一度に渡すためには、次のように配列の初期化子を使います。

@ArrayValues(data = { 1, 2, 3 })
public class ArrayValuesSample {

}

デフォルト値を設定する場合

アノテーションの注釈パラメータにデフォルト値を設定することもできます。デフォルト値を設定するには、注釈パラメータの定義でdefaultに続けてデフォルト値を記述します。

public @interface DefaultValue {
    String test() default "default";
}

注釈パラメータで値を受け取るように定義されたアノテーションを使用する場合は、アノテーションが付与されたクラスでは注釈パラメータを省略できません。注釈パラメータを省略すると、コンパイルエラーになりますが、デフォルト値が指定されている場合は、次のように注釈パラメータを省略してもコンパイルエラーになりません

@DefaultValue
public class DefaultValueSample {

}

最後に

今回はアノテーションの中でも、独自のアノテーションの作成方法についてまとめました。

独自のアノテーションを定義することは、Javaのプロジェクトでメタデータを柔軟に管理する手段として非常に有用です。アノテーションを使用することで、リフレクションを活用して実行時にメタデータを取得し、カスタムな処理や設定を行うことが可能になります。

独自のアノテーションを使って、プロジェクトの拡張性やメンテナビリティを向上させましょう。