我如何拥有抽象枚举或某种基本枚举?
在我的通用代码中,我想要一个enum占位符MyRetems的概念,而不是将自己与具体的枚举联系起来。然后在我的每个项目中,我都会有一个具体的实现。
E.g。 共同代码
public interface MyItems {
// Marker interface
}
项目A
public enum Items implements MyItems {
RED_CAR, BLUE_CAR, GREEN_CAR;
}
项目B
public enum Items implements MyItems {
BROWN_TREE, GREEN_TREE;
}
这似乎有效,但在我的公共代码中,我不能在我的界面枚举上写一个循环,因为它不是枚举。在我的通用代码中,我想写
for (MyItems item : MyItems.values())
doSomething(item);
但我不能,因为我的界面只是一个标记界面,它没有.values()。
任何建议都非常感谢。我不知道我是否以完全错误的方式尝试。
答案 0 :(得分:8)
这样做真的没有意义 - 因为values()
方法是静态。要调用它,您需要知道要调用它的类型。
你最接近的将是:
public interface MyItemsFactory<T extends MyItems>
{
Iterable<T> values();
}
然后以某种通用的方式实现它,例如
public class EnumFactory<T extends Enum<T> & MyItems>
implements MyItemsFactory<T>
{
private final Class<T> clazz;
public EnumFactory(Class<T> clazz)
{
this.clazz = clazz;
}
public Iterable<T> values()
{
return EnumSet.allOf(clazz);
}
}
但基本规则是多态和静态方法不混合。在你的电话中:
for(MyItems item : MyItems.values())
doSomething(item);
你期望它迭代的MyItems
的哪个实现?您可以拥有实现MyItems
的大量类型。
答案 1 :(得分:1)
您可以考虑使用Type Safe Enum Pattern替换枚举,这将允许您使用values()方法实现接口,该方法返回特定实现的所有值。
答案 2 :(得分:0)
获取课程并使用Class.getEnumConstants()从中挖掘值。 p>