Страницы

Поиск по вопросам

пятница, 11 января 2019 г.

Выбор между enum и final class для хранения опций

Разрабатываю приложение на Java 8, в котором мне необходимо использовать некие настройки. Настройки могут быть разными, объединяет их сейчас то, что есть некоторое представление настройки (сейчас это - элемент перечисления), и ключ и значение настройки. Настройки планируется добавлять в ArrayList
Сейчас передо мной встал выбор - использовать ли перечисление, реализующее общий интерфейс, для хранения настроек, или же попробовать воспользоваться final class
Конкретно Java я только начинаю всерьёз заниматься, поэтому вопрос может быть глуповат, но поиск в Сети на русском и английском языках не дал мне ясности.
Привожу пример (абстрактный), как реализовано сейчас:
public interface Option { public String getKey(); public String getValue(); }
public enum Option1 implements Option { OPTION1_VALUE_1("one"), OPTION1_VALUE_2("two"); private final String key; private final String value; Option1(String val) { this.key = "key1"; this.value = val; } @Override public String getKey() { return this.key; } @Override public String getValue() { return this.value; } }
public enum Option2 implements Option { OPTION2_VALUE_1("aaa"), OPTION2_VALUE_2("bbb"); private final String key; private final String value; Option2(String val) { this.key = "key2"; this.value = val; } @Override public String getKey() { return this.key; } @Override public String getValue() { return this.value; } }
Затем я планирую использовать эти "опции" как-то так:
List


Ответ

Первую реализацию можно заменить на более удачную. В Enum можно определять свои конструкторы и методы. Тогда нет необходимости создавать интерфейс и т.п.. Мне кажется это будет наиболее удачным вариантом решения.
public enum Option { OPTION_1("key 1", "value 1"), OPTION_2("key 2", "value 2");
private String key; private String value;
Option(String key, String value) { this.key = key; this.value = value; }
public String getKey() { return key; }
public String getValue() { return value; } }
UPDATE
По поводу использования. Если необходимо пройтись по всем опциям, то есть стандартный метод values()
for (Option op : Option.values()) { System.out.println(op.getKey() + " - " + op.getValue()); }
Если необходимо оперировать только частью опций, то используйте EnumSet, который предоставляет компактную и быструю структуру данных за счет внутренней реализации в виде битового вектора.

Комментариев нет:

Отправить комментарий