2013-06-17 2 views
1

Я хотел бы создать карту с расширяемыми значениями ключа.создать карту с расширяемыми значениями ключа

В настоящее время у меня есть общий проект с некоторым перечислением. В моем основном проекте, в котором я включил общий проект в зависимости, у меня есть карта, которая использует перечисление в качестве ключа: Map<SomeEnum, String>

Теперь я хотел бы, чтобы иметь возможность иметь какое-то карту, где я могу расширьте SomeEnum, чтобы создать конкретный набор значений для проекта, а затем используйте это на карте. Это вынуждает разработчика использовать только ключ от предопределенных переменных - вот почему я не использовал Map<String, String>

Я знаю, что перечисления не могут быть расширены, поэтому любое другое решение также будет оценено.

Альтернатива, насколько я могу видеть - если это невозможно - состоит в том, чтобы иметь Map<String, String>, но затем включить какую-то конкретную проверку проекта в Строках, которые находятся на карте, чтобы убедиться, что она является частью некоторого перечисления (т. е. определенный предопределенный набор переменных).

Спасибо за чтение. Надеюсь, это имело смысл. С нетерпением ждем ответов.

ответ

1

Map<YourInterface,String> решение. Сделайте свой enum орудием YourInterface.

+0

Очень умный. Это означает, однако, что у меня не может быть набора переменных по умолчанию в моем общем коде, который я хотел бы иметь. –

+0

Если вы уверены, что вам нужны ключи от одного перечисления, перейдите по адресу http://docs.oracle.com/javase/7/docs/api/java/util/EnumMap.html –

2

Создайте класс оболочки, который принимает значение SomeEnum как параметр конструктора. Сохраните его в поле и отрисуйте его final. Затем используйте этот обертку как ключ Map. Подобная функциональность может быть достигнута с наследования, но Effective Java от Джошуа Блох советует предпочесть состав над наследования.

Просто убедитесь, что реализованы методы hashCode и equals для сравнения с этим перечислением.

public class EnumWrapper<T extends SomeEnum> { 

    private final T fEnum; 

    public EnumWrapper<T>(SomeEnum enum) { 
     fEnum= enum; 
    } 

    @Override 
    public int hashCode() { 
     return fEnum.hashCode(); 
    } 

    @Override boolean equals(Object o) { 
     if (!(o instanceof EnumWrapper)) 
      return false; 

     EnumWrapper other= (EnumWrapper) o; 
     return this.fEnum.equals(o.fEnum); 
    } 
} 
+0

null check is not необходим, если используется 'instanceof' –

+0

@AjayGeorge благодарит, его автоматическая ручная вещь :) – darijan

+0

Как вы можете расширить SomeEnum, где SomeEnum имеет тип enum? У меня были ошибки времени компиляции, когда я пробовал ваш код - «невозможно преобразовать из SomeEnum в T». Кроме того, перечисление является ключевым словом java? поэтому java не примет это как имя переменной. Возможно, я полностью понял это, что java 7 может это сделать? Я на java 6. Спасибо –

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