アノテーションはJava 5で追加され、コンパイラーやさまざまなフレームワークが使用できるメタデータを提供します。最初は、JUnitやHibernateなどのツールがコードとより良く相互作用できるように、繰り返しの設定ファイルを書かずに済むように支援していました。
アノテーションは、クラス、メソッド、フィールド、パラメーター、さらにはローカル変数に情報を追加できるようにします。コンパイル時、ランタイム時、またはソースコード処理時に、検証、追加ファイルの生成、またはプログラムの動作の変更に使用されることがあります。
独自のアノテーションを宣言するには、キーワード @interface を使用します。
コードの例:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value(); } class Example { @MyAnnotation("Test") public void annotatedMethod() {} }
主な特徴:
アノテーションはランタイムにのみ影響しますか?
いいえ、アノテーションはソースコード(SOURCE)、バイトコード(CLASS)に制限されるか、実行時(RUNTIME)に利用可能です。その影響はRetentionPolicyによります。
@Retention(RetentionPolicy.SOURCE) public @interface SourceOnly {}
アノテーションのパラメーターはどの型でも可能ですか?
いいえ、許可されている型は、プリミティブ、文字列、列挙型、他のアノテーション、これらの型の配列のみです。オブジェクトは使用できません。
アノテーションを継承できますか?
厳密に言えば、アノテーションはクラスのように継承されません。唯一の例外は、@Inheritedアノテーションで、これは子クラスのみに適用され(メソッドには影響しません)。
大規模プロジェクトの開発者が、テストの自動化のためにさまざまなアノテーションを作成し、範囲を限定したり文書化したりすることを怠りました。その結果、新しいチームメンバーがどのアノテーションがどこで機能するか理解するのが困難でした。
長所:
短所:
チームでは、自分たちのアノテーションを書くための厳格な戦略を導入しました:必要なものだけを追加し、各アノテーションを詳細に説明し、その範囲を制限しました。
長所:
短所: