gpt4 book ai didi

java - java中枚举的优雅泛型 "Cross product"

转载 作者:行者123 更新时间:2023-12-03 01:48:49 29 4
gpt4 key购买 nike

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

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com