クラスの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