Java Enum引用另一个枚举

时间:2011-03-02 19:11:31

标签: java enums

我希望能够定义一个Enum类,它将包含另一个Enum以及它自己的值。例如,:

public enum A {
    A1, A2, A3;
}

public enum B{
    B1, B2, ...(somehow define references to all values in enum A)
}

使枚举B中包含的任何值必须定义为initself(例如B1,​​B2)或任何枚举值A.

谢谢,

4 个答案:

答案 0 :(得分:5)

这样BAB的联合?如果没有B扩展A,那么这是不可能的,这在java中是not supported。继续进行的方法是创建enum,其中包含AB的组合值,例如

enum C {
    A1, A2, A3, B1, B2;
}

答案 1 :(得分:2)

这样的东西?

enum A {
    A1, A2;
}

enum B {
    B1(null),
    B2(null),
    A1(A.A1),
    A2(A.A2);

    private final A aRef;
    private final B(A aRef) {
        this.aRef = aRef;
    }
}

答案 2 :(得分:2)

通常,由于我们在java中工作,并且通常禁止使用OO设计,因此您可以通过扩展来获得此功能。但是,枚举会隐式扩展java.lang.Enum,因此不能扩展另一个类。

这意味着枚举的可扩展性大部分来自不同的来源。

Joshua Bloch在第34项中的 Effective Java:Second Edition 中对此进行了广告,当时他为枚举提供了一个共享界面模式。以下是他的模式示例:

   public interface Operation {
        double apply(double x, double y);
    }

    public enum BasicOperation implements Operation {
        PLUS("+") {
            public double apply(double x, double y) { return x + y; }
        },
        MINUS("-") {
            public double apply(double x, double y) { return x - y; }
        },
        TIMES("*") {
            public double apply(double x, double y) { return x * y; }
        },
        DIVIDE("/") {
            public double apply(double x, double y) { return x / y; }
    }

这就像你在枚举时可以达到共享状态一样接近。正如JohanSjöberg上面所说的,简单地将枚举结合到另一个枚举中可能是最简单的。

祝你好运!

答案 3 :(得分:1)

最接近的是让A和B实现一些共享接口。

enum A implements MyEnum{A1,A2}
enum B implements MyEnum{B1,B2}

MyEnum e = B.B1;

此解决方案不适用于switch语句,也不适用于优化的枚举集合。

java enum实现不支持您的用例,要么实现复杂(与其实用性相比),要么它没有出现(我所知道的几种语言都没有直接支持)。