我需要提供enum
和generic
的某种设施。由于枚举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
来扩展类似枚举的行为时,它会被视为奇怪的东西吗?或者它是一种通用技术?
答案 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;
}
}