Java
アノテーション

Javaのアノテーションの名前がかぶったときの挙動

Javaを書くようになってアノテーションを使うようになりました。

ふと疑問に思ったのが、作ったアノテーションの名前が他のライブラリとかぶってしまったらどうなるの?ということです。

クラスの場合はパッケージ名を付けて明示的に示すことでクラスに同じ名前が使えますが、アノテーションにパッケージ名がつくというのがちょっと想像ができなかったので、簡単なアノテーションを作ってみました。

package名分けてさえいれば同名のクラスは作れるので作れるはずなのでaパッケージとbパッケージにそれぞれAアノテーションを作成しました。

package a;

public @interface A {
}
package b;

public @interface A {
}

何も処理がないので凄くシンプルですね。

では使ってみましょう!intelliJに身を任せてコーディングした結果下のようになりました

import a.A;

public class Main {
    @A //こいつはimport宣言されたAアノテーション
    // @a.A //↑と一緒じゃん!って怒られちゃうのでコメントアウトしてますが、この書き方も当然OK
    @b.A
    public static void main(String[] args){
    }
}

パッケージ名がそのまま入るのですね。

まとめ

 ひょっとしたらJavaエンジニア的には有名な話だったりするかもですがアノテーション名前かぶってもクラスみたいに使い分けできるんですね。
そしてアノテーションにパッケージ名が付いてるとなんかちょっと気持ち悪いというか見慣れない感が合って慣れるまでは大変そう。
ライブラリ同士でアノテーションの名前がかぶっても問題が無いことがわかって取り敢えず安心しました。