これは、探しているものの別のデモンストレーションです。このソリューションと以前のソリューションの違いは、これがより一般的で再利用可能なパターンであることです。実際、これは元の問題を超えており、このアプローチの他の利点を示しています。そのため、必要のないビットをコメントするだけでかまいません。動作を実証するための単体テストも添付します。
したがって、基本的に名前を探すApple
かAPPLE
、これらの列挙型のいずれかで次のように記述します。
FruitVeg<?> fvg = getEnum("APPLE", Fruits.class, Vegetables.class);
FruitVeg<>
は、列挙型の内部をタップすることもできるインターフェイスです。このインターフェイスを使用すると、以下の列挙型を使用して非常に興味深いことを行うことができます。これでできることのほんの一部を次に示します。
Enum.valueOf(fvg.getDeclaringClass(), fvg.name())
: 列挙値を返します。例: APPLE
fvg.getRaw()
: 列挙値を返します。例: APPLE
fvg.name()
: 列挙型の文字列名を返します。例: APPLE
fvg.getFriendlyName()
: 例:アップル
fvg.getDeclaringClass()
: クラスox.dummy.dummyTest $Fruitsなどを返します。 Class<Enum<?>>
fvg.getClass()
:クラス ox.dummy.dummyTest$Fruits が返す Class<?>
EnumSet.allOf(fvg.getDeclaringClass()))
: 例[りんご、梨]
ここにコードがあります
@Test
public void doSimpleTest() throws Exception {
FruitVeg<?> fvg = getEnum("APPLE", Fruits.class, Vegetables.class);
log.info("{} : {} : {} : {} : {}", fvg.name(), fvg.getFriendlyName(), fvg.getClass(), fvg.getDeclaringClass(), EnumSet.allOf(fvg.getDeclaringClass()));
log.info("get enum: {} ", Enum.valueOf(fvg.getDeclaringClass(), fvg.name()));
}
public interface FruitVeg<T extends Enum<T>> {
String name();
String getFriendlyName();
Class<T> getDeclaringClass();
T getRaw();
}
enum Fruits implements FruitVeg<Fruits> {
APPLE("Apple"),
PEAR("Pear");
Fruits(String friendlyName) {
this.friendlyName = friendlyName;
}
private final String friendlyName;
@Override
public String getFriendlyName() {
return friendlyName;
}
@Override
public Fruits getRaw() {
return this;
}
}
enum Vegetables implements FruitVeg<Vegetables> {
CARROT("Carrot"),
LETTUCE("Lettuce");
Vegetables(String friendlyName) {
this.friendlyName = friendlyName;
}
private final String friendlyName;
@Override
public String getFriendlyName() {
return friendlyName;
}
@Override
public Vegetables getRaw() {
return this;
}
}
public static FruitVeg<?> getEnum(String name, Class<? extends FruitVeg<?>>... fvgClasses) {
for (Class<? extends FruitVeg<?>> fruitVegCLass : Arrays.asList(fvgClasses)) {
for (FruitVeg<?> fvg : fruitVegCLass.getEnumConstants()) {
if (name.equals(fvg.name()) || name.equals(fvg.getFriendlyName())) {
return fvg;
}
}
}
return null;
}