是否可以在Java 8中扩展枚举?

Old*_*eon 14 java enums extend java-8

只是在玩和带有甜味的方式将功能添加到上前enums中的Java枚举toString()方法.

一些进一步的修补让我几乎也添加了一个整洁(即没有抛出异常)反向查找,但有一个问题.据报道:

error: valueOf(String) in X cannot implement valueOf(String) in HasValue
public enum X implements PoliteEnum, ReverseLookup {
overriding method is static
Run Code Online (Sandbox Code Playgroud)

有办法吗?

这里的目的是默默地添加(通过接口实现与defaultpoliteName在链接的答案中添加的lookup方法)一个方法,该方法执行该valueOf功能而不抛出异常.可能吗?现在显然可以扩展enum- 直到现在我的Java主要问题之一.

这是我失败的尝试:

public interface HasName {

    public String name();
}

public interface PoliteEnum extends HasName {

    default String politeName() {
        return name().replace("_", " ");
    }
}

public interface Lookup<P, Q> {

    public Q lookup(P p);
}

public interface HasValue {
    HasValue valueOf(String name);
}

public interface ReverseLookup extends HasValue, Lookup<String, HasValue> {

    @Override
    default HasValue lookup(String from) {
        try {
            return valueOf(from);
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

}

public enum X implements PoliteEnum/* NOT ALLOWED :( , ReverseLookup*/ {

    A_For_Ism, B_For_Mutton, C_Forth_Highlanders;
}

public void test() {
    // Test the politeName
    for (X x : X.values()) {
        System.out.println(x.politeName());
    }
    // ToDo: Test lookup
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 16

你的设计太复杂了.如果您愿意接受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
}
Run Code Online (Sandbox Code Playgroud)

你可以测试它:

Test foo=Test.FOO;
Test bar=foo.lookup("BAR"), baz=foo.lookup("BAZ");
System.out.println(bar+"  "+baz);
Run Code Online (Sandbox Code Playgroud)

非投掷/捕捉替代方案是:

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();
}
Run Code Online (Sandbox Code Playgroud)

使用像:

Test foo=Test.FOO;
Test bar=foo.lookup("BAR").orElse(null), baz=foo.lookup("BAZ").orElse(null);
System.out.println(bar+"  "+baz);
Run Code Online (Sandbox Code Playgroud)

  • 如果你不喜欢反射代码/临时数组,你可以用 `EnumSet.allOf(getDeclaringClass()).stream()` 替换 `Stream.of(getDeclaringClass().getEnumConstants())`。 (2认同)