在Java中嵌套枚举

时间:2011-06-21 11:17:26

标签: java enums

我想要嵌套一些枚举。我所代表的对象是Flags,有一个类型和一个值。存在离散数量的类型,每种类型都有一组不同的可能值。

因此,如果类型A的值可以是1,2或3,而类型B的值可以是4,5,6,那么我希望能够执行以下操作:

Flag f = Flag.A.1;

f.getType() - returns "A"

f.getValue() - returns "1"

Flag f2 = Flag.A.4; -- Syntax error.

我正在疯狂地尝试在枚举中嵌入枚举 - 这是我正在尝试的可能 - 我是否需要完全抛弃枚举并使用静态成员手动编写静态类?

到目前为止我的最大努力是:

public class Flag {

    enum A extends Flag {
        ONE("ONE"),
        TWO("TWO"),
        THREE("THREE");

        private A(String value) {
            Flag.type = "A";
            Flag.value = value;
        }
    }

        private static String type;
        private static String value;
}

但如果我这样做:

Flag f = Flag.A.ONE;

这些类型不兼容。

3 个答案:

答案 0 :(得分:11)

您不能将数字作为枚举。它必须是一个标识符。

你可以这样做

interface Flag {
    String getType();
    int getValue();
    enum A implements Flag{
        one, two, three;
        String getType() { return getClass().getSimpleName(); }
        int getvalue() { return ordinal()+1; }
    }
    enum B implements Flag{
        four, five, six;
        String getType() { return getClass().getSimpleName(); }
        int getvalue() { return ordinal()+4; }
    }
}

Flag f = Flag.A.one;

然而,更简单的选项可能是

enum Flag {
    A1, A2, A3, B4, B5, B6;
    public String getType() { return name().substring(0,1); }
    public int getValue() { return name().charAt(1) - '0'; }
}

Flag f = Flag.A1;

答案 1 :(得分:2)

无法嵌套枚举。但枚举可以实现接口。为什么不将AB作为两个不同的枚举,它们都使用TypedEnumgetType()方法实现getValue()接口?

答案 2 :(得分:0)

据我所知,他们是单身人士。这意味着枚举X {A,B}有两个单例实例A,B。如果你有嵌套枚举A {P,Q},你怎么说X.A是X.A.P还是X.A.Q?我希望我能够更简单地说出来。

使用静态类。