Java中的枚举和泛型

时间:2015-10-26 07:11:21

标签: java generics enums

我需要提供enumgeneric的某种设施。由于枚举cannot have type parameters(它只是被语法禁止)并且实际上就像public static final成员一样,我倾向于写这样的东西:

public class GenericEnumLikeClass<T>{

    public static GenericEnumLikeClass<MyType> TYPE_INSTANCE;
    public static GenericEnumLikeClass<AnotherType> ANOTHER_INSTANCE;

    //other things
}

事情是,我以前从未做过类似的事情,严格来说,不确定Java公约的正确性。当我们需要通过提供Type Paramters来扩展类似枚举的行为时,它会被视为奇怪的东西吗?或者它是一种通用技术?

3 个答案:

答案 0 :(得分:3)

这是在Java 1.5引入枚举之前使用的技术,因此它看起来并不奇怪。旧的API有很多这些枚举式的类。我建议将构造函数设为私有,并提供一个values()方法,该方法返回所有可用实例的数组。

答案 1 :(得分:1)

同意@Ingo,你可以使用它作为构造函数并提供一个value()方法,如:

public enum GenericEnumLikeClass { MyType("TYPE_INSTANCE"), AnotherType("ANOTHER_INSTANCE");

答案 2 :(得分:1)

不确切地知道你想要用你的&#39;泛型&#39;争论,但这可以给你一些想法:

编辑:由于你没有解释如何使用这个通用参数,我无法给出真实的例子。只需添加一些方法,来解释我的想法:

public enum MyGenericEnum {

    TYPE_INSTANCE(MyClass.class),
    ANOTHER_INSTANCE(AnotherClass.class);

    private Class<? extends SomeSuperClass> clazz;

    private MyGenericEnum(Class<? extends SomeSuperClass> clazz) {
        this.clazz = clazz;
    }

    public Class<? extends SomeSuperClass> getType() {
        return clazz;
    }

    @SuppressWarnings("unchecked")
    public <T extends SomeSuperClass> T getObject() {
        try {
            return (T) clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}