Javaのアノテーションとは何ぞや その1

 Java プログラマに「アノテーションって何?正月明けまでに理解して教えてwww」と言われたのを思い出したので調べてみた。ステータスが「 JavaDOC って何?」だった自分に何を言ってるんだと思ったけど面白そうで言ってしまった。「うん」
 理解できたかは甚だ怪しいが、とりあえずまとめ。なお、本エントリ内のアノテーション・JavaDoc用コメントを含む全てのJavaコードは、Wikipediaより引用した。

 とりあえずアノテーション – Wikipediaを見る。

Javaのアノテーションは、クラスやメソッド、パッケージに対してメタデータとして注釈を記入する。Javaのアノテーションは実態はjava.lang.Annotationインタフェースを継承したインタフェース(interface)であり、自作することもできる。

アノテーション – Wikipedia (2008-01-05)

「注釈として記入」という形式なこと、自作することができることが判った。

Javaのアノテーションは三つに分けることができる。

* マーカー・アノテーション ? データが無く名前だけを持つアノテーション。
* 単一値アノテーション ? データを一つだけ持つアノテーション。見かけはメソッド呼び出しに似ている。
* フル・アノテーション ? 複数のデータを持つアノテーション。

アノテーション – Wikipedia (2008-01-05)

3種類あることはわかった。

 もう少し読む。・・・駄目だこりゃ。JavaDOCから調べよう

開発者はソースコードにコメントを記述する時に、ある程度の決まった形式の文章とJavadocタグを使用する。ソースのコメントの内、/**で始まるものが、生成されたHTMLに含まれることになる。Javadocタグは、頭に”@” 記号が付く。

Javadoc – Wikipedia (2008-01-05)

 Wikipediaに載っているJavadocの使用例。

/**
 * クラスの説明.
 *  
 * ピリオド . または句点 。 で終わるところまでが、クラス一覧の概要に説明されるところであり、
 * ピリオド以降は説明の概要には含まれず、クラスの説明に含まれる。
 * このように、JavadocにはHTMLタグを使用することができる。
 *  

* @param 総称型パラメータの説明
* @param 総称型パラメータの説明
* @author Wikipedian
* @author Second author
* @version 1.6
* @since 1.0
*/
public class JavadocSample {

 クラスに総体型パラメータのT1とT2が有って、だから@paramで書かれている、と。こういう決まった形式で書き込んでおくことで、JavaDocなるツールを用いて、こいつをドキュメント化できるらしい。PHPにも似たことが出来るツールがあるらしい*1。で、JavaDocのこれはコメントの形式なのに対し、アノテーションは、例えばクラスの宣言時の修飾子のように記述する。アノテーションはJavaDocを置き換えるものではなく、個々の対象(クラスなど)にくっつける感じ。まさに注釈。

マーカーアノテーション

 さて、3種類のアノテーションの話に戻ろう。まずはマーカーアノテーション。クラスやメソッドの宣言にくっつけるだけ。

class DepprecatedClass {
  public boolean equals(Object obj){
    return this == obj;
  }
}

と書くところを

@Deprecated class DeprecatedClass {
  @Override public boolean equals(Object obj){
    return this == obj;
  }
}

のようにする。
 この場合は@Deprecatedと@Overrideがアノテーション。非推奨(Deprecated)のクラスDeprecatedClassと、スーパークラスからのメソッドをオーバーライドしたメソッドequalsの宣言、という意味になる。

単一値アノテーションとフルアノテーション

 単一値アノテーションはデータ型が1つ。フルアノテーションはデータ型が複数。他はあまり変わらないようだ。これらのアノテーションは、説明を読んで判らなくても、そのままアノテーションの定義について調べれば感覚が掴めた。気がする。
 とりあえず単一値アノテーションの説明を見る。

単一値アノテーションを付加するには以下のようにする。 この例は、Serializableインタフェースを実装したクラスのフィールドにstatic finalなserialVersionUIDが宣言されていないという警告を無視するアノテーションを付加していることを意味する。

アノテーション – Wikipedia (2008-01-05)

 宇宙語のような説明。「ある種類のクラスのフィールドに、そのクラスに必要な宣言がされていない場合に警告が出るが、「その警告を無視する」というアノテーションの記述例はこうですよ」ということなんだろうが。第一印象は「な、なーにさぶっこいてるだおめぇ」。
 では実際にどういう宣言がされているのか。

@SuppressWarnings("serial") 
class NoSerialVersionIDClass implements java.io.Serializable{ }

 これは簡単で、

class NoSerialVersionIDClass implements java.io.Serializable{ }

というクラスの宣言に、警告を抑制するアノテーションSuppressWarningsを加えたもの。@はアノテーションを示し、”serial”が抑制する警告の種類を示す*2。また、上に書いた書き方は省略形なので、正確な書き方は引用元ページやその他を参照のこと。

ここまでで少しあいまいな点を箇条書き、答えはfootnoteを。

  1. 警告を抑制って、「警告を抑制するクラスですよ」って示してるの?アノテーションがあることによって抑制されるの?*3
  2. 警告を抑制するアノテーションを書いたら、抑制するのはそのクラスだけ?それ以降全部?*4

とりあえず、以上。

その2で書くつもりのこと。

アノテーションの定義

 アノテーションは自作できます。ええ、インターフェースのように。

メタアノテーション

メタデータであるところのアノテーションの定義時に使われるアノテーション。メッタメタにしてあげる♪

アノテーションはこんなに便利

 これはその3になりそうな気配。Javaの普段の使い方知らないのに、便利も何もあるかいな。

  1. PHPDocumenter[本文へ]
  2. どの種類の警告がどんな単語と関連付けられているかは知らない。[本文へ]
  3. 後者。[本文へ]
  4. 前者。publicとかと書き方も同じだし判りやすい。[本文へ]

Leave a comment

Your comment

*