【问题标题】:Extending a enum in Java在 Java 中扩展枚举
【发布时间】:2011-09-24 14:00:18
【问题描述】:

我有一个枚举,我们称它为 A:

public enum A
{
    A,
    B
}

我有一个接受枚举 A 的函数:

public void functionA(A enumA)
{
    //do something
}

如何创建另一个枚举,可能调用 B,我可以传递给 functionA?像这样?

public enum B
{
    C
}

functionA(B.C);

我知道您不能扩展枚举,但我还有哪些其他可用选项?实现这一目标的最佳方法是什么?

【问题讨论】:

  • 您希望通过这样做来实现什么? functionA 采用 A 参数的原因是因为它只需要这些值。假设您可以以某种方式欺骗它从扩展枚举中获取另一个值。该函数如何知道如何处理它?
  • 我正在尝试添加一个与现有枚举类似的新枚举,但添加值也没有意义。我希望我根本不需要修改函数来处理它。
  • 请更具体。讨论一下这个函数实际上做了什么,实际的枚举值是什么,以及为什么新的枚举应该由同一个函数处理会有所帮助。

标签: java enums


【解决方案1】:

你不能让 Enums 扩展其他 Enums,但你可以声明一个所有 Enums 都可以实现的接口。该接口必须包含您希望在 Enum 值上调用的任何方法。这是一个例子:

public class Question6511453 {
    public static void main(String[] args) {
        System.out.println(functionFoo(EnumA.FirstElem));
        System.out.println(functionFoo(EnumA.SecondElem));
        System.out.println(functionFoo(EnumB.ThirdElem));
    }

    private interface MyEnums {
        int ordinal();
    }

    private enum EnumA implements MyEnums {
        FirstElem,
        SecondElem
    }

    private enum EnumB implements MyEnums {
        ThirdElem
    }

    private static int functionFoo(MyEnums enumeration) {
        return enumeration.ordinal();
    }
}

此解决方案的唯一问题是它剥夺了您在 switch 语句中使用 Enum 的能力,因为序数和值可能不再是唯一的。

这应该可以回答您的问题,但我怀疑它是否真的会帮助您解决问题。 :(

【讨论】:

    【解决方案2】:

    你不能。

    枚举类型是最终设计的。

    原因是每个枚举类型应该只有在枚举中声明的元素(例如,我们可以在 switch 语句中使用它们),如果你允许扩展,这是不可能的类型。

    你可以这样做:

    public interface MyInterface {
        // add all methods needed here
    }
    
    public enum A implements MyInterface {
        A, B;
        // implement the methods of MyInterface
    }
    
    public enum B implements MyInterface {
        C;
        // implement the methods of MyInterface
    }
    

    请注意,此时无法使用此接口执行switch。 (或者一般来说,switch 的对象可能来自多个 enum)。

    【讨论】:

    • 如果我不能,那么重构它的最佳方法是什么?
    • @user489051:查看我的最新编辑。嗯,和彼得发的一样。
    • 这会消除我打开枚举的能力吗?我想我现在会打开一个界面
    • 是的,如果 A、B 和 C 未在同一个枚举类型中定义,您不能执行switch(x) { case A: case B: case C: }
    • 你不能。您可以有一个枚举类型(例如enum A { A, B, C; }),也可以有多个枚举类型,但对于后一种,没有 switch 语句。 switch 语句要求有有限数量的元素,这与您添加更多枚举值相反。
    【解决方案3】:

    您应该将项目 C 添加到您的枚举 A。如果它是不相关的并且添加它没有意义,那么 functionA() 可能不应该是处理它的那个。

    【讨论】:

      【解决方案4】:

      你可以实现一个通用接口

      interface I { }
      
      enum A implements I {
         A, B
      }
      enum B implements I {
         C
      }
      public void functionA(I i) {
          //do something
      }
      
      obj.functionA(A.A);
      obj.functionA(B.C);
      

      【讨论】:

      • 这会消除我打开枚举的能力吗?
      • @user489041,您可以向可以调用的接口doSomething() 添加一个方法,而不是使用switch。每个方法都实现了您将在 switch 块中放入的内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      相关资源
      最近更新 更多