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

标签 java generics enums

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

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/

相关文章:

枚举和匹配属性的 C# 命名约定

java - GWT注入(inject): need good practice

java - EJB 3.2 - 无法正确配置远程客户端

c# - 以类型泛型/不可知的方式实现泛型方法的最佳方法

c# - 从子类实例调用的具有泛型参数的扩展方法

objective-c - 使用 objective-c 将 id 转换为枚举

swift - 如何在 Swift 2.0 中处理掩码(枚举)?

java - BaseAdapter 和 Picasso 问题

java - 如何在 JNI 中访问从 C++ 返回 java.lang.String 的 Java 方法的返回值?

delphi - 为什么释放不为空的TList <Int64>不会导致内存泄漏?