前回はイミュータブルクラスとrecordを使った安全なデータ設計を学びました。
今回は「アノテーション」について解説します。 これまで @Override を使ってきましたが、Javaにはほかにも便利なアノテーションが用意されています。アノテーションの意味と使い方を理解することで、コードの意図をより明確に伝えられるようになります。
アノテーションとは
アノテーション(Annotation)とは、クラス・メソッド・フィールドなどに付加できる「メタ情報」です。@ で始まる記号がアノテーションで、プログラムの動作そのものを変えるわけではありませんが、コンパイラやツールへの指示、コードの意図の明示などに使われます。
@アノテーション名
public void メソッド名() { ... }
よく使う標準アノテーション
Javaに標準で用意されているアノテーションの中でよく使われるものを紹介します。
@Override はすでに学んだとおり、親クラスやインターフェースのメソッドをオーバーライドしていることを明示します。タイプミスや引数の型違いをコンパイル時に検出してくれます。
@Deprecated は「このメソッドやクラスは古くなったので使わないでほしい」という印です。使用するとコンパイル時に警告が表示されます。
@SuppressWarnings はコンパイラの警告を意図的に抑制したい場合に使います。
@FunctionalInterface は、メソッドが1つだけのインターフェース(関数型インターフェース)であることを明示します。ラムダ式と組み合わせて使われます。
サンプルコード(標準アノテーションの活用)
ファイル作成
「Java15」フォルダに AnnotationTest.java という名前でファイルを作成します

コード入力
以下のコードを入力します。
public class AnnotationTest {
// 古いメソッドであることを示す
@Deprecated
public static void oldMethod() {
System.out.println("これは古いメソッドです");
}
// 新しいメソッド
public static void newMethod() {
System.out.println("これは新しいメソッドです");
}
// @SuppressWarnings でDeprecated警告を抑制
@SuppressWarnings("deprecation")
public static void main(String[] args) {
oldMethod(); // 本来は警告が出るが抑制されている
newMethod();
// @FunctionalInterface を使ったラムダ式
Greeter greeter = name -> System.out.println("こんにちは、" + name + "さん!");
greeter.greet("ぱんまる");
}
}
@FunctionalInterface
interface Greeter {
void greet(String name);
}

コンパイル
javac AnnotationTest.java

実行
java AnnotationTest
実行結果は次のようになります。
これは古いメソッドです
これは新しいメソッドです
こんにちは、ぱんまるさん!

カスタムアノテーション
Javaでは自分でアノテーションを定義することもできます。@interface キーワードを使って定義し、クラスやメソッドに付加することで独自のメタ情報を持たせることができます。
public @interface アノテーション名 {
型 要素名() default デフォルト値;
}
サンプルコード(カスタムアノテーション)
ファイル作成
「Java15」フォルダに Author.java、CustomAnnotationTest.java という名前でファイルを作成します

コード入力
Author.java に以下のコードを入力します。
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.TYPE)
public @interface Author {
String name();
String date() default "未設定";
}

CustomAnnotationTest.java に以下のコードを入力します。
@Author(name = "ぱんまる", date = "2026-07-05")
public class CustomAnnotationTest {
public static void main(String[] args) {
Author author = CustomAnnotationTest.class.getAnnotation(Author.class);
System.out.println("作者: " + author.name());
System.out.println("作成日: " + author.date());
}
}

コンパイル
javac Author.java CustomAnnotationTest.java

実行
java CustomAnnotationTest
実行結果は次のようになります。
作者: ぱんまる
作成日: 2026-07-05

コードの解説
@Deprecated をつけたメソッドを呼び出すと、通常はコンパイル時に「非推奨のAPIを使っています」という警告が表示されます。@SuppressWarnings("deprecation") をつけることでその警告を抑制できますが、本来は非推奨のメソッドを使わずに済む方法に切り替えるのが理想です。
@FunctionalInterface はメソッドが1つだけのインターフェースに付けます。このアノテーションがあると、メソッドを2つ以上定義しようとしたときにコンパイルエラーが出るため、関数型インターフェースの定義が守られます。ラムダ式を Greeter greeter = name -> ... のように代入できるのは、Greeter が関数型インターフェースだからです。
カスタムアノテーションの定義では、@Retention と @Target という「メタアノテーション(アノテーションのためのアノテーション)」を使っています。@Retention(RetentionPolicy.RUNTIME) はこのアノテーションの情報をプログラム実行時にも保持するという指定で、@Target(ElementType.TYPE) はクラスや interface に対してのみ付けられるという制限です。
CustomAnnotationTest.class.getAnnotation(Author.class) のように、リフレクションを使って実行時にアノテーションの情報を取り出すことができます。name() や date() がアノテーションの要素で、default "未設定" のようにデフォルト値を設定しておくと、指定を省略した場合にデフォルト値が使われます。
まとめ
アノテーションは @ で始まるメタ情報で、コンパイラへの指示やコードの意図の明示に使います。@Override でオーバーライドを明示し、@Deprecated で非推奨を示し、@FunctionalInterface でラムダ式と組み合わせる関数型インターフェースを定義するといった使い方を覚えておきましょう。カスタムアノテーションを使うことで独自のメタ情報を持たせることもできます。アノテーションはSpringなどのフレームワークでも非常に多く使われているため、意味を理解しておくとフレームワークの学習にもスムーズに入れます。
2026/07/05(日) ぱんまる


コメント