個人的メモ。
あるライブラリを弄っていて、アクセス修飾子がついていないEnumのインスタンスを引数に要求するメソッドに出くわしたのでこの方法を使った。
(そのメソッド自体はpublicなので、恐らくアクセス修飾子の考慮漏れか修正ミスだとは思う)
例: DemoType.java
package secret;
enum DemoType {
HOGE, FUGA, FOO, BAR
}
この[DemoType]には修飾子がついていないので、このenumが属している[secret]というパッケージに属しているプログラムからしか参照できない。
(普通に使おうとしてもコンパイルエラーとなる)
どうしても使いたい場合は、リフレクションで無理やり取得することが可能。
例: Demo.java
public class Demo {
public static void main(String... args) throws ClassNotFoundException {
Class<?> clazz = Class.forName("secret.DemoType");
Enum<?>[] elements = (Enum[]) clazz.getEnumConstants();
for (Enum<?> element : elements) {
System.out.println(element.name()); // enumの名称を出力する
}
}
}
実行結果: Demo.java
HOGE
FUGA
FOO
BAR
[Class.getEnumConstants()]はObjectの配列を返却するが、Enumの配列へキャストすることで、Enumとしての機能を使うことができる。
ここから更に対象の要素に絞りたいならば[Enum.name()]を使って絞り込めば良い。
ただリフレクションを使うと処理パフォーマンスが劣化するので
- (当たり前だが)[DemoType]が編集可能ならば[public]へ変更する
- [Demo]を[secret]パッケージへ変更する
のどちらかを選択する方が現実的だろう。