アノテーション
アノテーション(英語:annotation。英語発音: /ˌænəˈteiʃən/ アナテイシャン)とは、あるデータに対して関連する情報(メタデータ)を注釈として付与すること。XML等の記述形式を用いてメタデータをタグ付けする場合が多い。付与したメタデータやタグを指してアノテーションという場合もある。
元々の意味は、標本などを閲覧した際に、その標本に対するコメントなどを付すことを指す。そのような情報が書かれたものを、アノテーションカードと呼ぶ。コンピュータ領域以外におけるアノテーションに関しては、関連項目に記載する。
目次 |
Javaにおけるアノテーション[編集]
Javaでは、Java SE 5 から登場した機能にアノテーションという名前の機能がある。Javaのアノテーションは、クラスやメソッド、パッケージに対してメタデータとして注釈を記入する。Javaのアノテーションは実態はjava.lang.Annotationインタフェースを継承したインタフェース(interface)であり、自作することもできる。
Javaのアノテーションは三つに分けることができる。
- マーカー・アノテーション – データが無く名前だけを持つアノテーション。
- 単一値アノテーション – データを一つだけ持つアノテーション。見かけはメソッド呼び出しに似ている。
- フル・アノテーション – 複数のデータを持つアノテーション。
Java標準APIの主なアノテーション[編集]
@Deprecated– 対象となるクラスやメソッドが非推奨であることを情報として付加する。Javadocの@deprecatedと同じ。@Override– そのメソッドがスーパークラスのメソッドをオーバーライドしていることを示す。C#のoverride修飾子とほぼ同等の機能を果たす。@SuppressWarnings– 引数で指定した特定の警告メッセージをJavaコンパイラに与えず無視する。@Target– 定義したいアノテーションがどこに適用されるべきかを指し示すメタアノテーション。@Retention– アノテーションの配置方法を設定するメタアノテーション。
JUnit4 から利用可能になったアノテーション[編集]
- @Test – そのメソッドがテストメソッドであることを示す。このメソッドにテストを記述する。従来のJUnitでメソッド名が
testで始まるメソッドと同じ。 - @Before – このアノテーションが付加されたメソッドは、@Testアノテーションが付いたメソッドを実行するたびに事前に実行されることを意味する。JUnit4以前の
setup()メソッドと同じ。 - @After – このアノテーションが付加されたメソッドは、@Testアノテーションが付いたメソッドを実行するたびに、必ず後から実行されることを意味する。JUnit4以前の
tearDown()メソッドと同じ。 - @BeforeClass – このアノテーションが付加されたメソッドは、そのテストクラスを呼び出す前に実行される。
- @AfterClass – このアノテーションが付加されたメソッドは、そのテストクラスを呼び出した後に実行される。
アノテーションを使用する[編集]
マーカーアノテーション[編集]
クラスやメソッドにマーカーアノテーションを付加するには以下のようクラスやメソッドの接頭辞に最低一つ以上のスペースまたは改行コードを入れて修飾子のように記述する。 この例は、クラスに非推奨、メソッドに、スーパークラスからのメソッドをオーバーライドしていることを意味するマーカーアノテーションを付加している例である。
@Deprecated class DeprecatedClass {
@Override public boolean equals(Object obj){
return this == obj;
}
}
単一値アノテーション[編集]
単一値アノテーションを付加するには以下のようにする。 この例は、Serializableインタフェースを実装したクラスのフィールドにstatic finalなserialVersionUIDが宣言されていないという警告を無視するアノテーションを付加していることを意味する。
@SuppressWarnings(value = {"serial"})
class NoSerialVersionIDClass implements java.io.Serializable{ }
これは、以下のような書き方もできる。これは単一値アノテーション@SuppressWarningsがvalue()メソッドを一つしか持たないことがわかっているためvalue = を省略できることを意味する。
@SuppressWarnings("serial")
class NoSerialVersionIDClass implements java.io.Serializable{ }
このアノテーションは、戻り値の型がString[]になっているため同じvalue値であっても以下のように複数指定することができる。以下のように指定することで、シリアルバージョンIDが設定されていない警告と、コレクションで総称型による型チェックを行われていないことによって生ずる警告を無視することができる。 "unchecked"はメソッドに対してのみ設定することもできる。
@SuppressWarnings("serial", "unchecked")
class NoSerialVersionIDClass implements java.io.Serializable{
public void setupList(){
List list = new ArrayList();
list.add("abcdef");
}
}
このアノテーションは正確に記述すると以下のようにString[]配列の初期化宣言のようになる。
@SuppressWarnings(value = {"serial", "unchecked"})
フルアノテーション[編集]
フルアノテーションは、複数のデータ型を持つアノテーションである。ここでは自作したアノテーション@MyAnnotationがあるとき、以下のように、変数名 = 値の形をカンマで区切って記述する。各値の記法は、各アノテーションで定義されているメソッドの戻り値の型で決まる。たとえばこの場合valueという変数名はStringを戻り型にとるvalue()というメソッドと、intを戻り型にとるversion()というメソッドを持つ。フルアノテーションの場合は、defaultによりデフォルト値が設定されているアノテーション以外は、value = やversion = を省略することはできない。
@MyAnnotation(value = "abc", version = 2)
class AnnotatedClass {}
アノテーションを定義する[編集]
アノテーションを定義するには、interfaceキーワードの接頭辞に@をつけて定義する。
マーカーアノテーション[編集]
マーカーアノテーションは以下のように定義する。メソッドやフィールドが一切ないマーカーインタフェースのアノテーション版ともいえる。@Overrideや@Deprecatedがこれらのアノテーションに相当する。
public @interface MarkerAnnotation { }
単一値アノテーション[編集]
単一値アノテーションは以下のように定義する。このアノテーションには少なくともメソッドがひとつだけ定義されている。単一値アノテーションのメソッド名にはvalueという名前をつけるのが儀礼である。
@interface Single {
String value();
}
フルアノテーション[編集]
フルアノテーションは以下のように定義する。以下のように二つ以上のメソッドを定義する。
@interface FullAnnotation {
String value();
int id();
}
メタアノテーション[編集]
メタアノテーションとは、定義しているアノテーションのみにつけられるアノテーションのことである。メタアノテーションの例としては@Targetや@Retention、@Documented、@Inheritedがあり、これらはクラスやメソッドなどには使うことができず、アノテーションのみに使うことができる。アノテーションを定義するために使われるアノテーションということから、メタアノテーションと呼ばれる。
メタアノテーションを使用する[編集]
メタアノテーションを使ってアノテーションを定義するには、以下のように記述する。
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
public @interface NewAnnotation {
}
このとき、@Retentionは、新たにアノテーションNewAnnotationを作るとき、このアノテーション情報はソースコードのみにしか保存されないことを意味する。@Targetはこのアノテーションをどの型に使うことができるかを指定している。この場合、ANNOTATION_TYPEとMETHODを指定しているのでこのアノテーションはアノテーション型とメソッドにしか使うことができない。つまり、このNewAnnotationもまた、メソッドだけでなくアノテーションにも保存できるため、メタアノテーションとしても使えることを示している。
@Retention[編集]
メタアノテーション@Retentionには以下のRetentionPolicy列挙型を設定することができる。
| RetentionPolicy名 | 説明 |
|---|---|
| RetentionPolicy.CLASS | アノテーション情報はコンパイル時に保存されるが実行時にはVMによって保持されない。 |
| RetentionPolicy.RUNTIME | アノテーション情報はコンパイル時に保存され、実行時にもVMによって保持される。 |
| RetentionPolicy.SOURCE | アノテーション情報はコンパイル時に破棄される。ソースコード内のみで有効。 |
@Target[編集]
メタアノテーション@Targetには以下のElementType列挙型を設定することができる。これは配列を使って@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})と複数指定することができる。ただし、同じ値を{}内で複数使用するとエラーとなる。これによって型を指定することで、そのアノテーションが、どの型に対して使うことができるのかを指定できる。
| ElementType名 | 説明 |
|---|---|
| ElementType.ANNOTATION_TYPE | アノテーション型に指定できることを示す。 |
| ElementType.CONSTRUCTOR | コンストラクタに指定できることを示す。 |
| ElementType.LOCAL_VARIABLE | ローカル変数に指定できることを示す。 |
| ElementType.FIELD | フィールドに指定できることを示す。 |
| ElementType.METHOD | メソッドに指定できることを示す。 |
| ElementType.PACKAGE | パッケージに指定できることを示す。 |
| ElementType.PARAMATER | メソッド引数に指定できることを示す。 |
| ElementType.TYPE | クラス、またはインタフェース(アノテーション型を含む)、enum型に指定できることを示す。 |