在Java中扩展枚举

时间:2011-06-28 18:38:54

标签: java enums

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

public enum A
{
    A,
    B
}

我有一个带枚举A:

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

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

public enum B
{
    C
}

functionA(B.C);

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

4 个答案:

答案 0 :(得分: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
}

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

答案 1 :(得分:17)

您可以实现通用界面

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);

答案 2 :(得分:5)

您不能让Enums扩展其他枚举,但您可以声明一个所有Enum都可以实现的接口。接口必须包含您希望在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,因为序数和值可能不再是唯一的。

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

答案 3 :(得分:4)

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