Страницы

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

четверг, 2 января 2020 г.

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

#java #ооп


Разрабатываю приложение на 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


Ответы

Ответ 1



Первую реализацию можно заменить на более удачную. В 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, который предоставляет компактную и быструю структуру данных за счет внутренней реализации в виде битового вектора.

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

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