スポンサードリンク


Javaで同じアノテーションを複数宣言する方法!配列化して重複を回避するテクニックと使い方!

    Javaのアノテーションって一つのクラスオブジェクトに対して同じアノテーションを複数付与できないんですよね。

    そこがすごく不便だったりします。

    処理の共通化や属性の注入などクラス、メソッド、変数に対して
    行ないたい時になどにものすごく重宝するアノテーションですが同種類のものを複数指定できないという制限があります。

    Java アノテーション

    開発する際に同じアノテーションを複数指定したい時ってやっぱりでてくるんですよね。
    まあ、アノテーションに頼りすぎているという節もあるのかもしれませんが、それでも使いたい!

     

    Javaのアノテーションでは複数指定ができない

    例えば@Hogeというアノテーションをクラスに対して実装する場合、
    クラスを定義しているスコープの前に指定します。

    ではここで@Hogeを複数指定しようとします。

     

    当然Javaの仕様で重複するアノテーションにより2行目でエラーになってしまいます。

    どうやっても同じアノテーションを複数指定したい場合、
    この記述では動作しないです。

    複数アノテーションを指定するには次の方法で実現することができます。

    • アノテーションを配列化して宣言する
    • 別名のアノテーションを作り指定する

     

    アノテーションを配列化して宣言する

    個人的に一番手っ取り早いのがアノテーションを配列化してしまう方法です。

    特に開発フレームワーク内のアノテーションを使っているなら、
    下手にクラスの構造を崩すよりは配列化した方がたぶん安心です。

    という感じでアノテーションそのものをひとつのクラスに集約してしまえばいいのです。

     

    スポンサードリンク

     

    上の例では新規にHogesというアノテーションインターフェースを実装し、
    そのフィールドに複数指定したいアノテーションHogeを配列として宣言してしまう。

    つまり本来指定するアノテーションを直接使うのではなく、
    別のアノテーションを作成して、そのアノテーションを利用すればうまくいきそうですよね。

    あとはこの@Hogesを複数指定したかったクラスに付与させます。

     

    一応認識はしてくれますね。

    ちょっと面倒ですが、入れ子状態にしてあげればOKです。

    ただ開発フレームワークで利用するアノテーションによっては、
    うまく機能してくれないことがあったりします。

    というのも配列化したアノテーション要素を読み込むように作られていないとそうなりますね。

     

    別名のアノテーションを作り指定する

    もうひとつの方法も面倒なんですが、@Hogeと同じ構造のインターフェースを作ってしまうパターンです。

    そもそも宣言するアノテーションが違えばよいですよね。

    上の例では@Piyoというアノテーションを作成しています。

     

    あとはHogeとPiyoを2つ宣言してしまうだけです。

    少なくともこれなら確実に動作しますよね?

    同じ構造なら処理は別々で動作しても問題なく動作するはずです。

    しかし、3つ指定、4つ指定ともっとたくさんの同じアノテーションを宣言したい時には、
    毎度作る必要がありますし、それだけで手数ですし、命名規則・開発ルールなど崩す可能性もあります。

    何か良い方法はないのかな?

     

    まあ今回の例はあくまで逃げ道的な実装方法なので、
    普通は同じアノテーションを複数宣言するなんてNGなんでしょうね。

    Javaのアノテーションって便利だけど、使い方間違えるといろいろとまずいことになりそうです。

      The following two tabs change content below.
      よっき プロフィール画像
      パソコンが大好きな青年。職業はプログラマ/SE。 フリーランスとしてウェブサイトの構築・保守の業務に従事。専門学校とパソコンスクールで講師も担当。幼少期からパソコンが大好きで、趣味がそのまま仕事に転じた。自作PCの魅力に惹かれたのは学生時代の頃。自作PC専門ブログで、お得な情報を紹介しています。

      スポンサードリンク


      コメントを残す




      CAPTCHA


      このページの先頭へ