7. アノテーション
2005.12.12 株式会社四次元データ CTO 畠中晃弘
- 7.1. 標準アノテーション型
- 7.2. アノテーションの定義
- 7.3. 標準メタアノテーション型
J2SE5.0 ではプログラムの動作に影響を与えないアノテーション(注釈)を付加することができます。アノテーションがコメントと異なるのは、プログラムからアノテーションを読み取って処理したりできる点や、アノテーションがコンパイラの動作に影響を与える点などです。(javadoc はここで説明するアノテーションではありませんが)アノテーションと javadoc コメントは似ています。実際、アノテーションは javadoc が持っていた機能を一部持っていますし、将来的に javadoc がアノテーションに置き換えられる可能性もあります。
7.1. 標準アノテーション型
J2SE5.0 であらかじめ以下のアノテーション型が用意されています。これらを標準アノテーション型といいます。
- Override
- Deprecated
- SuppressWarnings
Override アノテーション
Override アノテーションは、メソッドにつけることのできるアノテーションです。Override アノテーションはメソッドがオーバーライドしていることを宣言します。
以下に Override アノテーションの例を示します。アノテーションはアノテーション型名の前に「@」を付けて使用します。Javadoc のようにコメント中に記載するのではない点に注意してください。
Class A { public void a() {} } Class B extends A { @Override public void a() {} }
オーバーライドされていないメソッドに Override アノテーションを付けているとコンパイルエラーとなります。オーバーロード(シグネチャの異なる同名メソッドの定義)でもエラーとなります。必ずオーバーライドしていなければいけません。このことにより、タイプミスなどによるメソッド名や引数の型の間違いを防止することができます。
Override クラスの定義(主要部のみ)は以下のようになっています(アノテーション定義の文法については後で説明します)。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override {}
Deprecated アノテーション
Deprecated アノテーションもメソッドに付けるアノテーションです。そのメソッドの使用が推奨されないことを示します。Javadoc の @deprecated タグと同じ意味を持ちます。アノテーションで指定した場合でも、その指定されたメソッドを使用するとコンパイル時に警告が出ますし、Javadoc にも deprecated であることが示されます(表現方法は少し異なります)。
package annotation; public class DeprecatedTest { public void test(){ new A().a(); } } class A { @Deprecated public void a(){} }
このクラスをコンパイルすると以下のようなメッセージが表示されます。
$ javac annotation/DeprecatedTest.java 注: annotation/DeprecatedTest.java は推奨されない API を使用またはオーバーライドしています。 注: 詳細については、-Xlint:deprecation オプションを指定して再コンパイルしてください。
詳細なメッセージを表示するためには、-Xlint:deprecation オプションを付けてコンパイルします。
$ javac -Xlint:deprecation annotation/DeprecatedTest.java annotation/DeprecatedTest.java:5: 警告: [deprecation] annotation.A の a() は推奨されません。 new A().a(); ^ 警告 1 個
Deprecated の定義は以下の通りです。
@Documented @Retention(RetentionPolicy.RUNTIME) public @interface Deprecated {}
SuppressWarnings アノテーション
SuppressWarnings アノテーションは、コンパイラが出す警告を抑制するアノテーションです。deprecated なメソッドの使用や、タイプセーフでないコレクションの使用などを行うと通常コンパイラは警告を出力しますが、コンパイル時にそれらの警告を抑制することができます。
抑止する警告の種別は、アノテーションに文字列配列の引数を渡すことにより個別に指定することができます。どのような種別を処理することができるかはコンパイラの実装に依存します。残念ながら Sun の JDK 5.0 Update 3 の段階では SuppressWarnings アノテーションは全く機能しません。
SuppressWarning の定義は以下の通りです。
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }