当前位置: 首页 > 面试题库 >

可以在Java 8中扩展枚举吗?

蓬新
2023-03-14
问题内容

只是在玩,并想出了一个甜蜜的方法来使用此方法enum在JavaEnum toString()方法中向s
添加功能。

一些进一步的修改使我 几乎 也可以添加整洁的(即不引发异常)反向查找,但是存在问题。报告:

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

有办法吗?

这里的目的是(通过一个接口实现,使用default像我politeName在链接的答案中添加的方法一样)静默地添加一个在不引发异常的情况下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
}

问题答案:

您使设计过于复杂。如果您愿意接受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);


 类似资料:
  • 问题内容: 这是我要完成的工作,我有一个包含一些值的枚举的类,我想对该类进行子类化并向该枚举添加更多值。这是一个不好的例子,但是: 因此HexDigits.Digit包含所有十六进制数字。那可能吗? 问题答案: 不,这不可能。最好的办法是使两个枚举实现和接口,然后使用该接口代替枚举。所以:

  • 问题内容: 我有一个枚举,我们称它为A: 我有一个需要枚举A的函数: 如何创建另一个枚举,可能调用B并传递给 functionA ?像这样吗 我知道您无法扩展枚举,但是我还有哪些其他选择?实现此目标的最佳方法是什么? 问题答案: 你不能 枚举类型在设计上是最终的。 原因是每个枚举类型都应 仅 具有 在枚举中声明的元素 (例如,我们可以在switch语句中使用它们),如果允许扩展类型,则不可能。 您

  • 问题内容: 是否可以在Java枚举中使用,还是需要使用?在我的测试中,它始终有效,但是我不确定是否可以保证。特别是,在枚举上没有方法,因此我不知道是否有可能获得一个枚举,该枚举将返回不同于的值。 例如,这样可以吗: 还是我需要这样写: 问题答案: 仅需2美分:这是Sun发布的Enum.java的代码,并且是JDK的一部分:

  • 问题内容: 我想分享一些枚举属性。就像是: 我知道了为什么不能继承(因为状态在中没有表示形式),但是我仍然想说“ ActionState就像具有更多选项的State,并且ActionState可以获取类型为State的输入,因为它们也属于输入ActionState” 我知道如何获得上述逻辑来复制案例并在函数中进行切换。但我正在寻找更好的方法。 我知道枚举不能在Swift中继承,并且我已经阅读了sw

  • 问题内容: 是否有比这更好的“解决方法”?访问TableMap上的方法时,我想避免使用PREFIX(局部变量)。 解决方法! 需要! 整个代码示例: 问题答案: 我认为您可能正在尝试将过多的情报投入其中。 我发现这种方法非常有用。它避免了由于无法扩展s 而引起的许多问题(实际上,您可以但不能以非常有用的方式)。 本质上,将其作为子类并将其特性作为传递给您的超类。这样,您仍然可以获得包括类型安全性在