
いまさら聞けない「Javadoc」と「アノテーション」入門
株式会社ガリレオ
小山博史
2011/5/19
独自のアノテーション型を作るには
既存のアノテーション型を使ってアノテーションをソースコードへ埋め込むだけでなく、独自のアノテーションを使いたいときがあります。そんなときは、自分でアノテーション型を定義します。どんな例があるか、考えてみましょう。
■ コメントで対応しようとすると
クラスに関する情報として、作成者、バージョン情報、依存するライブラリをソースコードへ埋め込みたかったとします。例えば、コメントで対応しようとすると次のように記述します。
package sample22.app7;
/**
* Author koyama
* Version 1.0
* Depend on sample22.lib.Util
*/
public class A {}
■ Javadocで対応しようとすると
Javadocコメントを使う場合は、次のようになります。AuthorとVersionに対応するJavadocコメント用のタグとして、@author、@versionがあるので、これを使い、「Depend on:」に対応するものはないので、単なるコメントとして入れておくことになります。
package sample22.app7;
/**
* Depend on sample22.lib.Util
* @author koyama
* @version 1.0
*/
public class A {}
「Depend on:」の情報をソースコードへ記載するに当たって、コメントだと「depend on:」とタイプミスをして記述してしまうこともあります。何らかの方法で正しく入れたい場合には、アノーテションを使います。
■ アノーテションを使うと
package sample22.app7;
/**
* @author koyama
* @version 1.0
*/
@Dependon("sample22.lib.Util")
public class A {}
依存するライブラリの情報は「Dependon」というアノテーション型を使って記述することにすれば、タイプミスで@dependonとしてしまった場合にもコンパイラがエラーを出してくれます。このように、ソースコードと一緒に埋め込みたい情報を定義したアノテーション型を独自に用意すると、何かと便利です。
■ アノテーションで複数の情報を付加
JavadocコメントとDependonで情報を付加するという方法で十分ですが、Javadocコメントと内容が重複するものの、アノテーションにも全部指定したい場合もあるでしょう。ここからの説明にも都合が良いので、例えば、次のような「ClassInformation」というアノテーションを用意して対応することについて考えてみます。
package sample22.app7;
/**
* @author koyama
* @version 1.0
*/
@ClassInformation(
author = "koyama",
version = 1.0,
dependon = "sample22.lib.Util"
)
public class A {}
このように、アノテーションには、「author」「version」「dependon」といった複数の要素を持たせることもできます。
■ アノテーション型の定義の作成
このアノテーションに対応するアノテーション型は次のように定義できます。アノテーションを指定するときは値を代入していますが、アノテーション型の定義ではメソッドを定義する点に注意してください。
ちなみに、Eclipseでは[ファイル]→[新規]→[注釈]とすることで、アノテーション型定義のひな型を作成できます。
package sample22.app7;
public @interface ClassInformation {
String author();
double version();
String dependon();
}
■ アノテーションで1つの情報を付加
また、「@Dependon("sample22.lib.Util")」というアノテーションを使うためには、アノテーション型としてDependonを定義する必要があります。こちらは、次のように定義できます。後で理由を説明しますが、1つしか要素を持たない場合は、普通は「value」という要素名を使います。
package sample22.app7;
public @interface Dependon {
String value();
}
ここでは、独自アノテーション型が必要になる例を考えてみました。DependonやClassInformationといったアノテーション型を用意したくなることがある点について、理解できたでしょうか。必要性について理解したところで、アノテーション型の定義について、詳細を理解しましょう。
アノテーション型を定義するには
アノテーション型の定義を見てinterface型の定義に似ていると思った人は多いでしょう。その通りでアノテーション型は、interface型の特殊なものです。入門レベルで知っていればいい範囲で説明します。
型の定義に当たっては、キーワードintefaceの前に@文字を付け、{ } 内には「アノテーション要素(annotation element)」を宣言します。interfaceが宣言できる場所であれば、アノテーションを宣言できます。修飾子もinterfaceに適用できるものを付けられます。
■ 型の定義
interface修飾子 @interface アノテーション名 {
アノテーション要素宣言
}
■ 要素(メソッド)の宣言
アノテーション要素については、次の基本的な宣言を覚えておけば十分です。「default デフォルト値」は省略可能です。型名には、基本データ型、String、enum型、他のアノテーション型、Class、これらの型のどれかの配列型を指定できます。
型名 アノテーション要素名() default デフォルト値;
■ アノテーション型の5つの特徴
アノテーション型については、下記のような特徴があります。アノテーションはインターフェイスの特殊なものなので、アノテーション要素は文法的にはメソッドです。ただ、説明上は、アノテーション要素とした方が分かりやすいので、こちらを使います。
- アノテーション型宣言ではジェネリックは使えない
- アノテーション型は暗黙のうちにjava.lang.annotation.Annotationを拡張する(他のクラスからextendsできない)
- アノテーション要素はパラメータを持てない
- アノテーション要素は型パラメータを持てない
- アノテーション要素はthrows節を持てない
■ defaultキーワードでデフォルト値を指定
なお、defaultキーワードを使って、要素に値が指定されなかったときのデフォルト値を持たせることもできます。次の例では、versionの初期値を1.0としています。デフォルト値には定数式かリテラルを指定できます。ただし、nullは指定できません。
package sample22.app8;
public @interface ClassInformation {
String author();
double version() default 1.0;
String dependon();
}
■ アノテーション要素の表現を変更
ここで、アノテーション要素「dependon」の表現を変更してみます。前提として、ほとんどのクラスがsample22.lib.Utilクラスに依存しているとします。その場合は、指定省略により自動でsample22.lib.Utilに依存しているようにしたいはずです。
また、説明を追加できるようにしたいとします。その場合は、次のような@Dependonを用意します。
@interface Dependon {
String value() default "sample22.lib.Util";
String description() default "";
}
ClassInformationは次のようにします。dependon()について、StringではなくDependonを使っている点に注意してください。
@interface ClassInformation {
String author();
double version() default 1.0;
Dependon dependon();
}
@Dependonが初期値を持っているので、アノテーションは次のように書くことができます。dependonは、@Dependonで指定されている初期値で初期化できる点に注目してください。
package sample22.app9;
/**
* @author koyama
* @version 1.0
*/
@ClassInformation(
author = "koyama",
version = 1.0,
dependon = @Dependon
)
public class A {}
@Dependonのdescription要素の値を変更したい場合は次のように記載します。
package sample22.app9;
@ClassInformation(
author = "koyama",
version = 1.0,
dependon = @Dependon(description = "メソッドaを使用")
)
public class B {}
アノテーション型の定義については以上です。 次ページでは、さらにアノテーションの指定方法について説明し、いくつかの特殊なアノテーションにも触れます。
| Index | ||||||||||
|
||||||||||
【改訂版】Eclipseではじめるプログラミング バックナンバー 連載インデックスへ»
- 第1回 Eclipse 3.4で超簡単Javaプログラミング基礎入門
- 第2回 Javaで一から理解するプログラムの変数と演算子
- 第3回 プログラミングの醍醐味! Javaで“条件式”を理解する
- 第4回 プログラミングの真骨頂! Javaで“反復処理”を覚える
- 第5回 データ集合を扱うのに便利なJavaの配列と拡張for文
- 第6回 複雑なデータを表現できるクラスやフィールドって?
- 第7回 クラスの振る舞いを表すJavaの“メソッド”とは?
- 第8回 Javaの参照型を文字列操作で理解して文法を総復習
- 第9回 プログラムを「変更」しやすくする“インターフェイス”
- 第10回 Javaの実案件に必須のパッケージとインポートを知る
- 第11回 「static」でクラス共有の変数・メソッドを使いこなせ!
- 第12回 継承やオーバーライドで簡単にクラスを“拡張”しよう
- 第13回 “コンストラクタ”と初期化、本当に理解できてる?
- 第14回 再利用性の高いクラス作成に重要な“アクセス制御”
- 第15回 Javaは「抽象クラス」で実装を上手に再利用できる
- 第16回 “ネスト”した型で始める軽量Javaプログラミング!?
- 第17回 あなたの知らない、4つのマニアックなJava文法
- 第18回 強く型付けされているJavaの理解に必修の“型変換”
- 第19回 キュー構造をJavaで実装してジェネリック型を理解する
- 第20回 拡張for文の真の実力を知り、反復処理を使いこなせ
- 第21回 7ステップで理解するJavaでの列挙型/enum使用法
- 第22回 いまさら聞けない「Javadoc」と「アノテーション」入門
- 第23回 プログラマの宿命! 例外とエラー処理を理解する
- 第24回 Javaの例外処理で知らないと損する7つのテクニック
| Java Solution全記事一覧 |
TechTargetジャパン
- Scalaのパッケージ、アクセス修飾子、オブジェクト継承 (2012/5/22)
インポート、パッケージオブジェクト、抽象クラス/抽象メソッド、オーバーライド、final、シールドクラスなども - 基幹系システムでCloud SQLは使えるか試してみた (2012/5/17)
サンプルとしてMRPシステムを作成して動かし、「再帰呼び出し」などのパフォーマンスを測定して検証してみます - アジャイル管理ツール9選+Pivotal Tracker入門 (2012/5/14)
群雄割拠のアジャイルプロジェクト管理ツールを9つ紹介し、特に注目を集めているPivotal Trackerの基本的な使い方を解説します - サーバサイドJSやJavaでWebアプリが作れるXPages (2012/5/11)
Notes/Dominoの資産をサーバサイドJavaScriptやJavaで操作し、HTMLやJavaScript、CSSをUIにできる技術を紹介
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -
