在Java中扩展枚举

use*_*041 23 java enums

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

public enum A
{
    A,
    B
}
Run Code Online (Sandbox Code Playgroud)

我有一个枚举A的函数:

public void functionA(A enumA)
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

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

public enum B
{
    C
}

functionA(B.C);
Run Code Online (Sandbox Code Playgroud)

我知道你不能扩展枚举,但我还有其他选择吗?实现这一目标的最佳方法是什么?

Paŭ*_*ann 48

你不能.

枚举类型是最终的设计.

原因是每个枚举类型应该只包含在枚举中声明的元素(例如,我们可以在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
}
Run Code Online (Sandbox Code Playgroud)

请注意,无法switch使用此接口执行此操作.(或者通常有一个switch对象可能来自多个enum).


Pet*_*rey 18

您可以实现通用接口

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

  • @ user489041,你可以在你可以调用的接口`doSomething()`中添加一个方法,而不是使用`switch`.每种方法都实现了您在交换机块中的内容. (5认同)
  • 这会删除我打开枚举的能力吗? (4认同)

Jes*_*ebb 5

你不能让枚举扩展其他枚举,但你可以声明一个你的所有枚举可以实现的接口.接口必须包含您希望在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案唯一的问题是它会像你在switch语句中一样想要使用Enum,因为序数和值可能不再是唯一的.

这应该回答你的问题,但我怀疑它实际上会帮助你解决问题.:(