如何包装Java枚举并仍然迭代它?

时间:2009-10-21 10:13:41

标签: java enums

我如何拥有抽象枚举或某种基本枚举?

在我的通用代码中,我想要一个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()。

任何建议都非常感谢。我不知道我是否以完全错误的方式尝试。

3 个答案:

答案 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()从中挖掘值。