Javaで同じアノテーションを複数宣言する方法!配列化して重複を回避するテクニックと使い方!
Javaのアノテーションって一つのクラスオブジェクトに対して同じアノテーションを複数付与できないんですよね。
そこがすごく不便だったりします。
処理の共通化や属性の注入などクラス、メソッド、変数に対して
行ないたい時になどにものすごく重宝するアノテーションですが同種類のものを複数指定できないという制限があります。
開発する際に同じアノテーションを複数指定したい時ってやっぱりでてくるんですよね。
まあ、アノテーションに頼りすぎているという節もあるのかもしれませんが、それでも使いたい!
Javaのアノテーションでは複数指定ができない
例えば@Hogeというアノテーションをクラスに対して実装する場合、
クラスを定義しているスコープの前に指定します。
ではここで@Hogeを複数指定しようとします。
1 2 3 4 5 | @Hoge(name="first") @Hoge(name="second") public class Jisakupc { } |
当然Javaの仕様で重複するアノテーションにより2行目でエラーになってしまいます。
どうやっても同じアノテーションを複数指定したい場合、
この記述では動作しないです。
複数アノテーションを指定するには次の方法で実現することができます。
- アノテーションを配列化して宣言する
- 別名のアノテーションを作り指定する
アノテーションを配列化して宣言する
個人的に一番手っ取り早いのがアノテーションを配列化してしまう方法です。
特に開発フレームワーク内のアノテーションを使っているなら、
下手にクラスの構造を崩すよりは配列化した方がたぶん安心です。
という感じでアノテーションそのものをひとつのクラスに集約してしまえばいいのです。
1 2 3 | @interface Hoges { Hoge[] hoges(); } |
上の例では新規にHogesというアノテーションインターフェースを実装し、
そのフィールドに複数指定したいアノテーションHogeを配列として宣言してしまう。
つまり本来指定するアノテーションを直接使うのではなく、
別のアノテーションを作成して、そのアノテーションを利用すればうまくいきそうですよね。
あとはこの@Hogesを複数指定したかったクラスに付与させます。
1 2 3 4 5 6 | @Hoges(hoges={ @Hoge(name="first"), @Hoge(name="second")}) public class Jisakupc { } |
一応認識はしてくれますね。
ちょっと面倒ですが、入れ子状態にしてあげればOKです。
ただ開発フレームワークで利用するアノテーションによっては、
うまく機能してくれないことがあったりします。
というのも配列化したアノテーション要素を読み込むように作られていないとそうなりますね。
別名のアノテーションを作り指定する
もうひとつの方法も面倒なんですが、@Hogeと同じ構造のインターフェースを作ってしまうパターンです。
1 2 3 | @interface Piyo { //( ...中略) } |
そもそも宣言するアノテーションが違えばよいですよね。
上の例では@Piyoというアノテーションを作成しています。
あとはHogeとPiyoを2つ宣言してしまうだけです。
1 2 3 4 5 | @Hoge(name="first") @Piyo(name="second") public class Jisakupc { } |
少なくともこれなら確実に動作しますよね?
同じ構造なら処理は別々で動作しても問題なく動作するはずです。
しかし、3つ指定、4つ指定ともっとたくさんの同じアノテーションを宣言したい時には、
毎度作る必要がありますし、それだけで手数ですし、命名規則・開発ルールなど崩す可能性もあります。
何か良い方法はないのかな?
まあ今回の例はあくまで逃げ道的な実装方法なので、
普通は同じアノテーションを複数宣言するなんてNGなんでしょうね。
Javaのアノテーションって便利だけど、使い方間違えるといろいろとまずいことになりそうです。
最新記事 by よっき (全て見る)
- 「圧着」と「圧接」の違い!コネクタを使った効率的な配線作業! - 2019年10月26日
- 夏の暑さ対策は大丈夫?冷却性能抜群のおすすめCPUクーラー!メモリに干渉しない最強の商品を紹介! - 2018年5月1日
- 自作PC弐号機のケースを換装!SilverStone製のミニタワーで冷却性とかっこよさを追求! - 2018年3月11日
スポンサードリンク