English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java フローコントロール

Java 配列

Java 面向オブジェクト(I)

Java 面向オブジェクト(II)

Java 面向オブジェクト(III)

Java 例外処理

Java リスト(List)

Java Queue(キュー)

Java Mapコレクション

Java Setコレクション

Java 入出力(I/O)

Java Reader/Writer

Java その他のトピック

Java アノテーション(Annotations)

このチュートリアルでは、アノテーションとは何か、異なるJavaアノテーション、それらの使用方法についてサンプルを通じて学びます。

Javaアノテーションは、プログラムのソースコードのメタデータ(データに関するデータ)です。

これらはコンパイラにプログラムに関する追加情報を提供しますが、プログラム自体の一部ではありません。これらのアノテーションは、既にコンパイルされたプログラムの実行に影響を与えません。

アノテーションは@で始まる。その構文は次の通りです:

@AnnotationName

@Overrideアノテーションの例として見てみましょう。

@Overrideアノテーションは、同じ名前のメソッド、返り値の型、および引数リストを指定して、親クラスのメソッドをオーバーライドする方法を指定します。

メソッドを再書き直すときは、常に@Overrideを使用する必要はありません。しかし、それを使用する場合、コンパイラはエラーが発生した場合(例えば、誤ったパラメータの型など)にエラーメッセージを出力します。

例1:@Override注釈の例

class Animal {
  public void displayInfo() {
    System.out.println("I am an animal.");
  }
}
class Dog extends Animal {
  @Override
  public void displayInfo() {
    System.out.println("I am a dog.");
  }
}
class Main {
  public static void main(String[] args) {
    Dog d1 = new Dog();
    d1.displayInfo();
  }
}

出力結果

I am a dog.

この例では、displayInfo()メソッドが親クラスAnimalと子クラスDogの両方に存在します。メソッドを呼び出すときは、子クラスのメソッドが呼ばれます。親クラスのメソッドではありません。

注釈の形式

注釈には要素(メンバー/属性/パラメータ)

1.マーク注釈

マーク注釈にはメンバーが含まれていません/要素。これは宣言をマークするのにただ使われます。

その構文は:

@AnnotationName()

これらの注釈には要素が含まれていないため、括弧は必要ありません。例えば、

@Override

2.単一要素注釈

単一要素注釈は1つの要素のみを含んでいます。

その構文は:

@AnnotationName(elementName = "elementValue")

要素が1つしかない場合、慣習的にその要素をvalueと名付けます。

@AnnotationName(value = "elementValue")

この場合、要素名を省略することもできます。デフォルトの要素名valueです。

@AnnotationName("elementValue")

3.多要素注釈

これらの注釈は、カンマで区切られた複数の要素を含んでいます。

その構文は:

@AnnotationName(element1 = "value1", element2 = "value2")

注釈の場所

どんな宣言も宣言の上に置いて注釈をマークすることができます。Javaから 8から始め、注釈は型の前に置かれることもあります。

1.宣言文の上

上記の通り、Javaの注釈はクラス、メソッド、インターフェース、フィールド、その他のプログラム要素の宣言の上に置かれます。

例2:@SuppressWarnings注釈の例

import java.util.*;
class Main {
  @SuppressWarnings("unchecked")
  static void wordsList() {
    ArrayList wordList = new ArrayList<>();
    //これにより、確認されていない警告が発生します。
    wordList.add("w"}}3codebox"); 
    System.out.println("Word list => " + wordList);
  }
  public static void main(String args[]) {
    wordsList();
  }
}

出力結果

Word list => [w3codebox]

上記のプログラムが@SuppressWarnings("unchecked")アノテーションを使用しない場合にコンパイルすると、コンパイラはプログラムをコンパイルしますが、以下の警告を出します:

Main.java uses unchecked or unsafe operations.
Word list => [w3codebox]

警告を受け取ります

Main.java uses unchecked or unsafe operations

以下の文が原因です。

ArrayList wordList = new ArrayList<>();

これは、配列リストの一般的なタイプがまだ定義されていないためです。この警告を解消するために、尖括号<>内でジェネリクスを指定することができます。

ArrayList<String> wordList = new ArrayList<>();

2.タイプ注釈

Java 8以前は、コメントは宣言にのみ適用できました。今では、タイプコメントも使用できます。これは、タイプを使用する場所のどこにでもアノテーションを配置できることを意味します。

コンストラクタ呼び出し

new @Readonly ArrayList<>()

タイプ定義

@NonNull String str;

この宣言はStringタイプの非空変数strを指定し、NullPointerExceptionを避けます。

@NonNull List<String> newList;

この宣言はStringタイプの非空リストを指定します。

List<@NonNull String> newList;

この宣言はStringタイプの非空値のリストを指定します。

タイプ変換
newStr = (@NonNull String) str;

extends および implements 子句

class Warning extends @Localized Message

throws 子句

public String readMethod() throws @Localized IOException

タイプコメントはJavaコードのより良い解析とより強力なタイプチェックを提供します。

アノテーションの種類

1. プリedefインストールされたアノテーション

  1. @Deprecated

  2. @Override

  3. @SuppressWarnings

  4. @SafeVarargs

  5. @FunctionalInterface

2. メタアノテーション

  1. @Retention

  2. @Documented

  3. @Target

  4. @Inherited

  5. @Repeatable

3. カスタムアノテーション

これらのアノテーションの種類はJava アノテーションの種類チュートリアルには詳細な説明があります。

アノテーションの使用

  • コンパイラの指示 - コンパイラに指示を提供し、エラーを検出したり警告を無効にしたりするために使用できます。例えば、内蔵のアノテーション @Deprecated、@Override、@SuppressWarning などがあります。

  • コンパイル時の指示 - これらの注釈が提供するコンパイル時の指示は、ソフトウェア構築ツールがコード、XMLファイルなどを作成する際に役立ちます。

  • 実行時の指示 - 実行時の指示を提供するためのアノテーションを定義することができます。これらのアノテーションはJava 反射を使用してアクセスされます。