我正在寻找一种为多个枚举构建包装器的方法。假设你有
public enum Enum1 {
A,B,C
}
public enum Enum2 {
ONE,TWO,THREE
}
我想要一个带有文字的新枚举
(A,ONE), (A,TWO), (A,THREE), (B,ONE), ...
整个事情都是通用的,所以我不必知道 Enum1 和 Enum2。有没有办法构建它,甚至将其扩展到 n 个枚举?
或者我应该寻找其他通用方法来建模?
最佳答案
我会设置一个类来表示您所指的元组。如果需要,您可以在这里使用泛型:
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;
}
}
用法:
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);
您还可以用枚举实例表示每个元组,如下所示:
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;
}
}
用法:
Tuple.AONE.getE1(); //returns A
Tuple.AONE.getE2(); //returns ONE
对您来说可能有意义的是使用通用接口(interface)来包装枚举表示和类表示,如下所示:
public interface EnumTuple<E1, E2> {
E1 getE1();
E2 getE2();
}
这将允许您互换使用类或枚举:
public class EnumTupleImpl<E1 extends Enum<E1>, E2 extends Enum<E2>> imlements EnumTyple<E1, E2>{
...
}
public enum Tuple implements EnumTuple<Enum1, Enum2>{
...
}
用法:
EnumTuple<Enum1, Enum2> tupe1 = new EnumTupleImpl<Enum1, Enum2>(Enum1.A, Enum2.ONE);
EnumTuple<Enum1, Enum2> enum1 = Tuple.AONE;
关于java - java中枚举的优雅泛型 "Cross product",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13610120/