Annotation/J2SE5.0

Annotation/J2SE5.0
=JSR 175:A Metadata Facility for the Java Programming Language
 →Java言語仕様第3版に組み込まれる?

■コンパイラで処理される“注釈”

 「アノテーション」=「注釈」
 →ソース・コードに付加情報を記すためのもの。
 ⇒アノテーションの記述があってもなくても、
  プログラムの意味(クラスやメソッドの宣言の意味)は変わらない。

 「コメント」=「注釈」
 →ソース・コードに付加情報を記すためのもので、
  その記述によってプログラムの意味が変わることはない。

 アノテーションとコメントの違いは?
 ⇒コンパイラによって処理されるか否かである。

 コメント→コンパイル時には基本的に無視される。
 アノテーション→コンパイラによって、型チェックなどの処理が行われる。
         コンパイラによって処理される付加情報となる。


 コンパイラに処理させるためには、構文が決まっていないとNG。
 →アノテーションの構文も詳細に決められてる。
  =アノテーションの追加≒Javaの新たな構文。
  
■アノテーションの構文

 アノテーションサンプル
  「ToDo」というアノテーションをクラス宣言、メソッド宣言、ローカル変数宣言に付けている。

--------------------------------------------------
// クラス宣言のアノテーション

@ToDo(//クラス宣言に対して「priority = 10」、「summary = "このクラスに…"」という情報を付加
priority = 10,
summary = "このクラスに…"
)

class Foo {
// メソッド宣言のアノテーション

@ToDo(//メソッド宣言に対して「priority = 5」、「summary = "このメソッドに…"」という情報を付加
priority = 5,
summary = "このメソッドに…"
)

public void bar() {
// ローカル変数宣言のアノテーション

@ToDo(//ローカル変数宣言に対して「priority = 1」、「summary = "この変数に…"」という情報を付加
priority = 1,
summary = "この変数に…"
)

int x;
}
}
--------------------------------------------------


アノテーション=ある構文要素に付加情報を記述するための構文要素。
→利用するには、「対象となる構文要素は何か」と「どのような情報を記述できるのか」を把握していること。


□「対象となる構文要素は何か」
 アノテーションを付加できる対象:クラスやメソッドなど以下6つの「宣言」。
 ・パッケージ宣言
 ・型宣言(クラス、インタフェース、enum、アノテーション)
 ・フィールド宣言(enum型の宣言内の定数[以下、enum定数]も含む)
 ・メソッド/コンストラクタ宣言
 ・引数宣言
 ・ローカル変数宣言

 アノテーション→構文上は修飾子の一種。
        ⇒アノテーションを書く位置は宣言の前。
 ※ブロックや文にアノテーションは付けられない。

□「どのような情報を記述できるか」
 アノテーションに記述する情報:キーと値のペアの並び。
 ex
  ----------
  @ToDo(
    priority = 10,
    summary = "このクラスに…"
  )
  ----------
  ↑priority、summaryというキーに、さまざまな値を関連づけている。
 
 アノテーションの記述方法:
 「@」で始まり、「=」で関連づけたキーと値のペアを括弧の中に並べて記述。
 ----------
 @アノテーション名(
  キー = 値,
  キー = 値,
  …
 )
 ----------

 ※「@(atマーク)」なのは
  Javadocのタグで「@」が使われていたことからと、annotation typeの頭文字と同じになることからなんだとか。

 アノテーション記述時の順序:規定なし。
 ↓どちらもOK。
 public @ToDo(priority = 5, summary = "このメソッドに…") void bar() {…}
 @ToDo(priority = 5, summary = "このメソッドに…") public void bar() {…}
 だけど、可読性を考慮すると、後者が推奨される。

■アノテーション型

・Java:型づけされた言語。
    ∵コンパイル時のエラー検出の精度を高めるため。
    
    アノテーションもコンパイルの対象→アノテーション型。

・アノテーション型=特殊なインタフェース型
 ----------
 @interface ToDo {
  int priority();
  String summary();
 }
 ----------
 ・「@interface」の後:通常のインタフェースと同様(制限あり)。
 ・宣言の型名(ここではToDo)=アノテーションの名前。
 ・型名には、「@」をつけること。
 ・宣言中のメソッドの名前=アノテーションのキー。
  ex.アノテーションには、priority、summaryというキーを記述。
 ・宣言中のメソッドの戻り値の型=アノテーションの値の型。
  ex.メソッドpriorityの戻り値はint型→priorityキーの値はint型。

 ∴↓アノテーションとアノテーション型宣言の対応
  アノテーション側   アノテーション型宣言側
  ----------      ----------
  @ToDo {        @interface ToDo {
   priority = 10,     int priority();
   summary = "…"     String summary();
  }           }
  class Foo {...}


・アノテーションの記述はコンパイラが処理
 →他のコードと同じようにコンパイラによる型チェックなどが行われる。
  ∴↓エラる。
   ----------
   // クラス宣言のアノテーション
   @ToDo(
    priority = "重要",
    sumary = "このクラスに…"
   )
   class Foo {...}
   ----------
   ∵priorityキーの値は、int型であるべき!
   ∵summaryキーがスペルミス。

■略記法
□マーカ・アノテーション
 アノテーション型宣言でメソッドが1つもない(アノテーションに書くキーが1つもない)アノテーション

 マーカ・アノテーションの使用
 →括弧を省略できる。
 ex
 --------------------
 @interface Marker {}
 --------------------
 @Marker() //OK
 class Foo {
  …略…
 }
 --------------------
 @Marker //OK
 class Foo {
  …略…
 }
 --------------------

 Javaの標準アノテーションのOverrideやSuppressWarnings→マーカ・アノテーション

□デフォルト値
 アノテーションにはすべてのキーを書くのが原則。

 ex
 --------------------
 @interface ToDo {
  int priority();
  String summary();
 }
 --------------------
 @ToDo(summary = "このクラスに…")
 class Foo {…}
 --------------------
 ↓コンパイル
 --------------------
 test.java:7: 注釈 ToDo に priority がありません。
  summary = "このクラスに…"...
 エラー 1 個
 --------------------
 ∵アノテーション型ToDoには、priorityとsummaryの2つのメソッドが宣言されている。
  が、クラスFooのアノテーションにはpriorityキーが書かれていない。

 ↓
 アノテーション型宣言のメソッドの数が多いと、すべて書くのは面倒。
 で、
 アノテーションの値に、デフォルト値が指定される仕組みがある。
 利用するには、
 アノテーション型宣言内のメソッド宣言の後ろに「default」というキーワードとデフォルト値を書く。

 ex
 アノテーションToDoのpriorityキーに「10」というデフォルト値を指定
 --------------------
 @interface ToDo {
  int priority() default 10;
  String summary();
 }
 --------------------
 ∴コンパイル・エラーにはならない。

□メソッドvalueしかないアノテーション型

 アノテーション型宣言にvalueというメソッドしか宣言されていない場合、
 アノテーションでの「value =」の記述を省ける。

 ex
 --------------------
 @interface Single {
  String value();
 }
 --------------------
 @Single(value = "このクラスは…")
 class Foo {…}
 --------------------
 ↓
 --------------------
 @interface Single {
  String value();
 }
 --------------------
 @Single("このクラスは…")
 class Foo {…}
 --------------------

 ※アノテーション型宣言にメソッド宣言が1つだけで、その名前がvalueの場合に限る。

□単一要素配列

 配列型のキーの値に、要素が1つの配列を指定する場合、
 配列の初期化を表す中括弧記述は省略可。

 ex
 --------------------
 @interface ToDo {
  String summary();
  String[] assign();
 }
 --------------------
 @ToDo(
  summary = "このクラスで…",
  assign = {"ヤンガス"}
 )
 --------------------
 ↓メソッドassignの戻り値の型がString型の配列→アノテーションのassignキーも配列型になる。
 --------------------
 @interface ToDo {
  String summary();
  String[] assign();
 }
 --------------------
 @ToDo(
  summary = "このクラスで…",
  assign = "ヤンガス"
 )
 --------------------

ref:
ITアーキテクト, J2SE 5.0の新機能 第12回 アノテーションの基本
http://www.itarchitect.jp/technology_and_programming/-/38761.html

tag : Annotation J2SE5.0

2008-02-28 22:48 : __lang__java : コメント : 2 : トラックバック : 0 :
コメントの投稿
非公開コメント

■アノテーションの値に指定できる型(アノテーション型宣言のメソッドの戻り値の型)
  使用可能な型:
   ・プリミティブ型(boolean、byte、char、short、int、long、float、double)
   ・String型
   ・Class型(Class<Object>のように型引数付きのものも含む)
   ・enum定数
   ・アノテーション型
   ・上記の型を要素とする配列(配列の配列は不可)

  ex
   アノテーションToDoのpriorityキーにenum定数のHIGHを指定。
   アノテーション型宣言にString型の配列を戻り値とするメソッドassignを追加。
   アノテーションToDoのassignキーに複数の文字列要素を指定。
   --------------------
   enum Priority {HIGH, NORMAL, LOW}
   --------------------
   @interface ToDo {
    Priority priority();
    String summary();
    String[] assign();
   }
   --------------------
   @ToDo(
    priority = Priority.HIGH,
    summary = "このクラスに…",
    assign = {"ヤンガス", "ゼシカ"}
   )
   class Foo {...}
   --------------------

  ・アノテーションを値として持つアノテーション
   アノテーション型での指定も可能
   アノテーションToDoの配列型のキーであるassignの値に指定する要素の型を、
   グループと名前の組から成るアノテーション型Personに変更する。
   --------------------
   @interface Person {
    String group();
    String name();
   }

   @interface ToDo {
    …略…
    Person[] assign();
   }
   --------------------
   @ToDo(
    …略…
    assign = { 
     @Person(group="開発", name="ヤンガス"),
     @Person(group="設計", name="ゼシカ")
    }
   )
   class Foo {
    …略…
   }
2008-03-05 09:54 : 8318 URL : 編集
■アノテーション型宣言の制限
 ・extendsできない
  ※暗黙でjava.lang.annotation.Annotationのサブインタフェースになる
 ・メソッドは引数持てない
 ・メソッドの戻り値の型は、前記の通り
 ・メソッドはthrows節持てない
 ・Genericsの型引数使えない
 
 以外は通常のインタフェース型と同じ。
2008-03-05 13:06 : 8318 URL : 編集
« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud