java中枚举的优雅通用“叉积”

rat*_*osk 4 java generics enums

我正在寻找一种为多个枚举构建包装器的方法。说你有

public enum Enum1 {
    A,B,C
}

public enum Enum2 {
    ONE,TWO,THREE
}
Run Code Online (Sandbox Code Playgroud)

我想要一个带有文字的新枚举

(A,ONE), (A,TWO), (A,THREE), (B,ONE), ...
Run Code Online (Sandbox Code Playgroud)

整个事情都是通用的,所以我不必知道 Enum1 和 Enum2。有没有办法构建它,甚至将其扩展到 n 个枚举?

或者我应该寻找其他通用方法来建模?

Joh*_*sen 5

我会建立一个类来代表您所指的元组。如果您愿意,您可以在这里使用泛型:

public class EnumTupleImpl<E1 extends Enum<E1>, E2 extends Enum<E2>> {
    private final E1 e1;
    private final E2 e2;

    public EnumTupleImpl(E1 e1, E2 e2) {
        this.e1 = e1;
        this.e2 = e2;
    }

    public E1 getE1() {
        return e1;
    }

    public E2 getE2() {
        return e2;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

EnumTupleImpl<Enum1, Enum2> tupe1 = new EnumTupleImpl<Enum1, Enum2>(Enum1.A, Enum2.ONE);
EnumTupleImpl<Enum1, Enum2> tupe2 = new EnumTupleImpl<Enum1, Enum2>(Enum1.A, Enum2.TWO);
EnumTupleImpl<Enum1, Enum2> tupe3 = new EnumTupleImpl<Enum1, Enum2>(Enum1.A, Enum2.THREE);
Run Code Online (Sandbox Code Playgroud)

您还可以用枚举实例表示每个元组,如下所示:

public enum Tuple {
    AONE(Enum1.A, Enum2.ONE),
    ATWO(Enum1.A, Enum2.TWO),
    ATHREE(Enum1.A, Enum2.THREE);

    private Enum1 e1;
    private Enum2 e2;

    private EnumTupleEnum(Enum1 e1, Enum2 e2) {
        this.e1 = e1;
        this.e2 = e2;
    }

    public Enum1 getE1() {
        return e1;
    }

    public Enum2 getE2() {
        return e2;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Tuple.AONE.getE1(); //returns A
Tuple.AONE.getE2(); //returns ONE
Run Code Online (Sandbox Code Playgroud)

对您来说可能有意义的是使用通用接口来包装枚举表示和类表示,如下所示:

public interface EnumTuple<E1, E2> {
    E1 getE1();
    E2 getE2();
}
Run Code Online (Sandbox Code Playgroud)

这将允许您互换使用类或枚举:

public class EnumTupleImpl<E1 extends Enum<E1>, E2 extends Enum<E2>> imlements EnumTyple<E1, E2>{
...
}

public enum Tuple implements EnumTuple<Enum1, Enum2>{
...
}
Run Code Online (Sandbox Code Playgroud)

用法:

EnumTuple<Enum1, Enum2> tupe1 = new EnumTupleImpl<Enum1, Enum2>(Enum1.A, Enum2.ONE);
EnumTuple<Enum1, Enum2> enum1 = Tuple.AONE;
Run Code Online (Sandbox Code Playgroud)