Динамическое перечисление Java при запуске - PullRequest
1 голос
/ 05 ноября 2019

Я украл следующее перечисление у jenkov, например, для целей ..

public enum Level {
    HIGH  (3, 33, 333),  
    MEDIUM(2, 22, 222),  
    LOW   (1, 11, 111);
}

Так что есть несколько чисел, которые могут привести к одному и тому же типу перечисления, и 1 и 11 вернут LOW. Это я уже имел в виду.

На самом деле вопрос в том, могут ли значения перечисления (как называются? Например, 1, 11, 111 ) быть динамическими? Кажется, что список, необходимый здесь, со временем изменится, и лучшим решением будет загрузка новых списков при запуске.

Таким образом, идеальным решением будет что-то вроде

public enum Level {
    HIGH  (listHigh),  
    MEDIUM(listMedium),  
    LOW   (listLow);
}

Эти списки будутзагружается при запуске @Configuration @Bean

Но перечисления являются статическими, и даже с static int array[] = { 1, 2, 3, 4, 5 }; я получаю недопустимую прямую ссылку.

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

Пожалуйста, запросите любую информацию, которую я мог здесь упустить, спасибо

Ответы [ 2 ]

3 голосов
/ 05 ноября 2019

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

Один из них - наличие конструктора enum, который вы можете написать явно, поиск параметров конфигурации:

public enum Level {
    HIGH,  
    MEDIUM,
    LOW;

    private final int whatever;

    Level() {
        this.whatever = someCodeToLoadFromConfig(name());
    }
}

Второе - вообще не включать эти значения в перечисление, а хранить EnumMap с нужными вам параметрами:

public enum Level {
    HIGH,  
    MEDIUM,
    LOW,
}

EnumMap<Level, LevelSettings> levels = new EnumMap<>(Level.class);
for (Level level : Level.values()) {
    levels.put(level, someCodeToLoadFromConfig(level.name());
}

Второе имеет большое преимущество, котороев том, что легко создавать альтернативные варианты для использования в модульных тестах. Это то, что я бы порекомендовал.

Еще лучше: зачем вообще использовать enum? Просто включите класс Level и попросите его указать его имя ("Easy" и т. Д.) И настройки (1, 11 и т. Д.). Создайте их список при запуске, и все готово. Таким образом, вам не нужно подсказывать изменения переключателей при добавлении настройки уровня Epic.

1 голос
/ 05 ноября 2019

Даже если вы можете сделать это, вы не должны. Если вам нужны списки, взятые из свойств запуска, лучше создайте карту с этим перечислением в качестве ключа и загруженным списком в качестве значения. Затем поместите эту карту в правильный контекст и используйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...