How can I wrap a Java enum and still iterate over it?

enums, java

Solution

It doesn't really make sense to do this - because the `values()` method is static. To call it, you need to know the type you want to call it on.

The closest you could come would be to have:

public interface MyItemsFactory<T extends MyItems>
{
    Iterable<T> values();
}

and then implement that in some generic way, e.g.

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);
    }
}

But the basic rule is that polymorphism and static methods don't mix. In your call:

for(MyItems item : MyItems.values())
    doSomething(item);

which implementation of `MyItems` would you expect it to iterate over? You could have loads of types implementing `MyItems`.

Problem

How can I have an abstract enum, or some kind of base enum? In my common code I'd like a notion of an enum placeholder, MyItems, without tying myself to a concrete enum. Then in each of my projects I would have a concrete implementation. E.g. Common Code ``` public interface MyItems { // Marker interface } ``` Project A ``` public enum Items implements MyItems { RED_CAR, BLUE_CAR, GREEN_CAR; } ``` Project B ``` public enum Items implements MyItems { BROWN_TREE, GREEN_TREE; } ``` This seems to work, but in my common code I can't write a loop over my interface enum, since it's not an enum. In my common code I'd like to write ``` for (MyItems item : MyItems.values()) doSomething(item); ``` but I can't because my interface is just a marker interface, and it doesn't have a .values(). Any suggestions greatly appreciated. I don't know if I'm trying in completely the wrong way.

Original source