Java枚举引用另一个枚举

6

我希望能够定义一个枚举类,其中包括另一个枚举以及它自己的值。例如:

public enum A {
    A1, A2, A3;
}

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

任何包含在枚举B中的值必须是自身定义的(如B1,B2)或枚举A中的任何值。

谢谢。


1
为什么需要扩展枚举? - Woot4Moo
4个回答

5

这是指BAB的并集吗?在Java中,这是不可能的,除非B扩展了A,但这是不被支持的,详情请参阅此处。正确的做法是创建一个enum,其中包含AB的组合值,例如,

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

(这是A继承B的过程。) - Tom Hawtin - tackline

3
像这样的内容吗?
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;
    }
}

感谢大家的回答。看起来没有简单的方法可以实现我所想要的功能。我选择使用一个普通的Java类来模拟这样的特性。 - MikeMY

2

通常,由于我们在使用java,通常采用面向对象的设计,您可以通过扩展获得此功能。但是,枚举隐式地扩展java.lang.Enum,因此不能扩展另一个类。

这意味着枚举的可扩展性必须来自其他来源。

约书亚·布洛赫在Effective Java: 第二版中的第34项中介绍了一种用于枚举的共享接口模式。以下是他模式的示例:

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

当涉及枚举时,这是您可以接近共享状态的方式。正如Johan Sjöberg上面所说的那样,最简单的方法可能是将枚举组合成另一个枚举。

祝好运!


1

你能做到的最接近的方式是让 A 和 B 实现一些共享接口。

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

MyEnum e = B.B1;

这个解决方案不能与switch语句或优化的枚举集合一起使用。

你的用例不被Java枚举实现所支持,因为它要么太复杂而不值得实现(与其有用性相比),要么没有涉及到(我所知道的很少语言都不直接支持这个)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接