annotation

□definition
アノテーション:ソースコードそのもの対して情報を与えるもの

□background
≠コメント
annotationは、
プログラムからアノテーションを読み取って処理できる
コンパイラの動作に影響を与える
≒javadocコメント
アノテーションは、
javadoc が持っていた機能を一部持っている
将来的にjavadocが置き換えられる可能性もある

□merits of annotation
・手間軽減
アノテーションをDIなどプログラミング機能の重要な一部として使うことで、
プログラミングの手間を軽減させ、ソースコード量を大幅に減らせる。
・マーキング
コメントのように文章ではなく、
それ自体が「意味」を持ったマーキングを言語レベルで行うことができる。

□種類:overview
・アノテーションタイプ
 アノテーションを定義するもの
・アノテーション
 クラスに記述するメタデータ
the relationship b/t annotationType and annotation is sth like the relation b/w interface and class.

■種類:アノテーション
there are three types depends on the usage.
・フルアノテーション
 引数を指定する場合
・単一値アノテーション
 引数が1つのみで、省略できる場合
・マーカアノテーション
 引数を指定しない場合

□種類:作成観点
・Java#core#APIにあるannotation
・自分で定義するcustomAnnotation

■種類:Tiger#annotation
・Override
・Deprecated
・SuppressWarning

□Override
(for method)
overrideされていないmethodに@Overrideするとコンパイルエラーになる。
オーバーロード(シグネチャの異なる同名メソッド)でもエラーになる。
→タイプミスなどによるメソッド名や引数の型の間違い防止になる。
====================
Override-class
--------------------
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}
====================

□Deprecated
(for method)
そのメソッドの使用が推奨されないことを示す。
=Javadoc の @deprecated タグ
その指定されたメソッドを使用するとコンパイル時に警告が出て、
Javadoc にも deprecated であることが示される。
====================
Documented-class
--------------------
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {}
====================

□SuppressWarning
deprecated なメソッドの使用や、
タイプセーフでないコレクションの使用で、
通常コンパイラは警告を出力されるが、
コンパイル時にそれらの警告を抑制する。
抑止する警告の種別は、
アノテーションに文字列配列の引数を渡すことにより個別に指定できる。
====================
SuppressWarning-class
--------------------
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
====================

■customAnnotation
例1
====================
定義例
--------------------
public @interface A {
String value();
}
--------------------
アノテーション定義の本体には、メソッド宣言を記述できる。
このメソッド宣言はアノテーション型の「要素」と呼ばれる。
要素名は任意に指定できるが、
要素が一つしかないアノテーションでは通常「value」という名前を用いる。
「value」という名前は特別に省略可となる。
====================
使用例
--------------------
@A("foo") public void a() {
...
}
====================
例2
====================
定義例
--------------------
public @interface B {
String[] b();
int c();
}
====================
使用例
--------------------
@B(
b={"foo","bar"},
c=10
)
public void b() {
...
}
====================

□メタアノテーション
アノテーション型に対しても定義できる。
そのようなアノテーション型を対象とする
アノテーション型をメタアノテーション型と呼ぶ。

■標準メタアノテーション型
予め定義されている標準メタアノテーション型
・Target
・Retention
・Documented
・Ingerited

□Target
アノテーションがどの要素(クラスやメソッドなど)に対して適用できるかを定義。
指定する要素は enum 型の java.lang.annotation.ElementType で定義されている。
・TYPE
 クラス・インタフェース・enum・アノテーションの宣言
・FIELD
 フィールドの宣言(enum定数を含む)
・METHOD
 メソッドの宣言
・PARAMETER
 メソッドのパラメータの宣言
・CONSTRUCTOR
 コンストラクタの宣言
・LOCAL_VALIABLE
 ローカル変数の宣言
・ANNOTATION_TYPE
 アノテーション型の宣言
・PACKAGE
 パッケージの宣言

□Retention
アノテーションで付加された情報がどの段階まで保持されるかを定義する。
指定する段階は enum 型の java.lang.annotation.RetentionPolicy で定義されている。・SOURCE
 ソース上だけのアノテーションで、クラスファイルには記録されないことを示す。
・CLASS
 クラスファイルにもアノテーションの情報が記録される。
 ただしそのクラスをJVMにロードしても、
 JVMにはアノテーションの情報はロードされない。
 Retentionアノテーションを指定しなかった場合は、CLASSを指定したとみなされる。
・RUNTIME
 クラスファイルに情報が記録され、クラス使用時にはJVMにも情報がロードされる。
 JavaプログラムからリフレクションAPIでアノテーションの情報を読み取るためには、 この種別でないとNG。

□Documented
対象となるアノテーションにより付加した情報が javadoc コマンドなどで作成したドキュメントに反映させることを示す。
マーカーアノテーションで、要素はない。

□Ingerited
クラス宣言に付加するアノテーションが、対象となるクラスのサブクラスにも継承されることを指示する。


ref:
マイコミジャーナル
http://journal.mycom.co.jp/column/java/027/index.html
TECHSCORE
http://www.techscore.com/tech/J2SE/JavaLanguage/7.html
2007-10-07 01:21 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud