クラスのFQCNな文字列

Javaで、「パッケージ名+クラス名+識別子」な文字列などを使う場合、
次のSample01の様に直接、リテラルな文字列として定数(static final)を宣言する場合があります。
ちなみに「パッケージ名+クラス名」をFQCN*1と言います。
下のクラスのFQCNは「jp.ne.hatena.ttmmrr.Sample01」です。

package jp.ne.hatena.ttmmrr; // パッケージ名

public class Sample01 { // クラス名
 // ↓「パッケージ名+クラス名+識別子」
 public static final String ACTION = "jp.ne.hatena.ttmmrr.Sample01.ACTION";

 public static void main(String[] args) {
    System.out.println(ACTION);
 }
}

上の書き方は普通だし普段は問題はないですが、次の場合にはまる場合があります。

  • パッケージ名の変更
  • クラス名の変更
  • 他のクラスにコードを流用した場合、文字列を変更し忘れる

staticでなければ、

this.getClass().getName();

で、「パッケージ名+クラス名」を取得できます。
しかし、staticな場合には「this」が使えないです。

そこで、無名内部クラスを作り、それを囲むクラスを取得します。

package jp.ne.hatena.ttmmrr; // パッケージ名

public class Sample02 { // クラス名
  static final Class<?> KLASS = new Object() {
    public Class<?> getKlass() {
      return getClass().getEnclosingClass();
    }
  }.getKlass();

 // ↓「パッケージ名+クラス名+識別子」
 public static final String ACTION = KLASS.getName() + ".ACTION";

  public static void main(String[] args) {
    System.out.println(KLASS);
  }
}

*1:Fully Qualified Class Name