您使设计过于复杂。如果您愿意接受
default只能在实例上调用方法,那么整个代码可能如下所示:
interface ReverseLookupSupport<E extends Enum<E>> { Class<E> getDeclaringClass(); default E lookup(String name) { try { return Enum.valueOf(getDeclaringClass(), name); } catch(IllegalArgumentException ex) { return null; } }}enum Test implements ReverseLookupSupport<Test> { FOO, BAR}您可以使用以下方法进行测试:
Test foo=Test.FOO;Test bar=foo.lookup("BAR"), baz=foo.lookup("BAZ");System.out.println(bar+" "+baz);非抛出/捕获的替代方案是:
interface ReverseLookupSupport<E extends Enum<E>> { Class<E> getDeclaringClass(); default Optional<E> lookup(String name) { return Stream.of(getDeclaringClass().getEnumConstants()) .filter(e->e.name().equals(name)).findFirst();}使用像:
Test foo=Test.FOO;Test bar=foo.lookup("BAR").orElse(null), baz=foo.lookup("BAZ").orElse(null);System.out.println(bar+" "+baz);


