2009-10-21 1 views
3

Как я могу получить абстрактное перечисление или какой-либо базовый enum?Как я могу перевернуть перечисление Java и все еще перебирать его?

В моем общем коде я хотел бы иметь представление об элементе enum, MyItems, не привязывая себя к конкретному перечислению. Тогда в каждом из моих проектов у меня была бы конкретная реализация.

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 ​​().

Любые предложения с благодарностью. Я не знаю, пытаюсь ли я полностью ошибиться.

ответ

8

Это не имеет смысла делать это, потому что метод values() is static. Чтобы вызвать его, вам нужно знать тип, который вы хотите назвать.

Ближайшим вы могли прийти бы иметь:

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

, а затем реализовать, что в каком-то общем виде, например,

Но основное правило заключается в том, что полиморфизм и статические методы не смешиваются. В вашем вызове:

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

, реализация которых в MyItems вы бы ожидать, что она перебирать? У вас может быть множество типов, реализующих MyItems.

+0

Спасибо за ваш ответ, который я изучу и попытаюсь понять полностью. Чтобы ответить на ваш вопрос, я не думаю, что я был очень ясен. Мой идеал заключается в том, чтобы иметь возможность «вводить» перечисление, которое я хотел бы использовать, которое изменится в каждом проекте, который использует общий код. Тогда мне бы хотелось, чтобы общий код имел возможность перебирать перечислимое число и делать вещи. – Pengin

+0

Если это нужно, чтобы иметь возможность перебирать его, и вы хотите сделать это полиморфно, то, что вам нужно ввести, - это завод, показанный в моем ответе. Это позволит вам правильно перебирать значения. –

1

Вы можете рассмотреть замену перечислений на Type Safe Enum Pattern, что позволит реализовать интерфейс с помощью метода values ​​(), который возвращает все значения для конкретной реализации.

Смежные вопросы