My Photo

« 詐欺か、運用の失敗か #kabu | Main | アノテーション その2 »

February 25, 2012

アノテーション その1

アノテーションはクラスやメソッド、パッケージにメタデータを付加する注釈。
アノテーション自体はプログラムの処理に影響を与えないが、ツールが読み取って利用する。ソースコード中にアノテーションを書いても、そのアノテーションを利用するツールを利用しなければ何も意味がない。

標準アノテーション

java.langパッケージに定義されているアノテーション。

@Override
メソッドがスーパークラスのメソッドをオーバーライドしていることを示す。
オーバーライドされていないメソッドにこのアノテーションを付けるとコンパイルエラーとなる。
@Deprecated
メソッドの使用が推奨されないことを示す。
@SuppressWarnings
コンパイラが出す警告メッセージを抑制する。
"@SuppressWarnings" の後ろに括弧で囲って抑制する警告を書く。波括弧で複数書くこともできる。抑制できる警告はコンパイラの実装に依存する。
下記のコードでは1行目のSuppressWarningsアノテーションは複数の警告を指定している。抑止している警告はシリアライズに関する警告とfinally節に関する警告。
指定できる警告については参考ページに説明がある(公式な情報ではないと思うが)。
@SuppressWarnings({"serial", "finally"})
public class GenericsSample implements Serializable {

  public <U> List<U> foo(U element) {
    @SuppressWarnings("unused")
    List<U> unUsedList;

    @SuppressWarnings("unchecked")
    List<U> list = (List<U>)new ArrayList<Object>();
    try {
      list.add(element);
    } finally {
      return list;
    }
  }
}

アノテーションの定義

アノテーションの定義はまずあればメタアノテーション(アノテーションに対するアノテーション)、次に "@interface" 、その後ろにアノテーションの名前、最後に中括弧で囲って本体(メンバなど)を書く。
アノテーションはクラスやインタフェースと同じ型の1つであり、publicなアノテーション型は同名のソースファイルに記述する必要がある。
また、以下の制限がある。

  • アノテーション型は、暗黙にjava.lang.annotation.Annotationインタフェースを拡張しているので extends を書くことはできない。
  • メソッドは、パラメータを持つことはできない。
  • アノテーション型はジェネリックスを使用してパラメータ化することはできない。
  • 型パラメータを持つメソッドを定義することはできない。
  • メソッドには、throws節は書けない。
  • メソッドの戻り値型は基本データ型(char,byte,short,int,long,float,double),String,Class,enum型,アノテーション型か、これらの型の配列でなければならない。

マーカーアノテーション型
メンバのないアノテーション。OverrideアノテーションとDeprecatedアノテーションもこれにあたる。
下記はマーカーアノテーション型の例として、将来変更になるかもしれないという意味のマーカーアノテーションの定義。

/**
* Annotation with this type indicates that the specification of the
* annotated API element is preliminary and subject to change
*/
public @interface Preliminary { }
使用する場合は "@Preliminary" か "@Preliminary()" となる。

単一メンバアノテーション
メンバ(メソッド)を1つだけ持つアノテーション。SuppressWarningsアノテーションがこれに当たる。
下記は単一メンバアノテーション型の定義の例

/**
 * Associates a copyright notice with the annotated API element
 */
public @interface Copyright {
  String value();
}
メンバの名前が value の場合、アノテーションを使うときにメンバの名前を省略して値だけ書くことで済ますことができる。
@<アノテーション名>(<値>)
省略しないで書くことも当然できる。省略しない完全な文法で書くとこうなる
@<アノテーション名>(<メンバ名>=<値>)

複数のメンバを持つアノテーション
メンバが複数ある場合は、使用時にメンバーを省略することはできず、下記のように <メンバ名>=<値> をカンマで区切って書く。

@RequestForEnhancement(
  id = 286874,
  synopsis = "Privde time-travel functionality",
  engineer = "Mr. Peabody",
  date = "4/1/2004"
)

メンバのデフォルト値
下記のようにdefaultという予約語でメンバのデフォルト値を設定できる。

// Annotation type declaration with defaults on some members
public @interface RequestForEnhancement {
  int id(); // No default - must be specified in each annotation
  String synopsis(); // No default - must be specified in each annotation
  String engineer() default "[unassigned]";
  String date() default "[unimplemented]";
}

参考ページ:
7. アノテーション | TECHSCORE(テックスコア)
Java警告抑止方法メモ(Hishidama's Java SuppressWarnings Memo)
Java Annotations: An Introduction - Developer.com

参考記事:Java Press Vol.37 J2SE 5.0 実践チュートリアル

« 詐欺か、運用の失敗か #kabu | Main | アノテーション その2 »

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/54073660

Listed below are links to weblogs that reference アノテーション その1:

« 詐欺か、運用の失敗か #kabu | Main | アノテーション その2 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof