Получение значений Enum из неизвестной строки - PullRequest
0 голосов
/ 27 мая 2020

У меня есть Enum среднего размера, в котором я хочу получить значения из заданной String. Например,

GAUL_RAM("gaul_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
GAUL_RAM_UPGRADED("gaul_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),  
GREEK_RAM("greek_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
GREEK_RAM_UPGRADED("greek_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
PERSIA_RAM("persia_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
PERSIA_RAM_UPGRADED("persia_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
CARTHAGE_RAM("carthage_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
CARTHAGE_RAM_UPGRADED("carthage_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0));

У меня есть указанное выше перечисление. Мне может быть передано значение, например, "персия". Тогда я хочу извлечь значение String из константы Персии PERSIA_RAM, а также из ее объекта Location.

Однако я не вижу «чистого» способа сделать это. На ум приходят решения: проверка предоставленной строки «persia», перебор всех значений в перечислении через Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants().toString().toLowerCase();, а затем использование какого-то разделителя в знаках подчеркивания '_' для получения первого слова в константе перечисления.

Опять же, это не лучшее решение. Есть ли лучший способ выполнить sh эту задачу?

1 Ответ

0 голосов
/ 27 мая 2020

Вы можете создать HashMap String для перечисления во время загрузки класса, поэтому вам не нужно выполнять строковые операции каждый раз, когда вы хотите найти значение перечисления. Ниже приведен пример того, как я бы это сделал:

public class Testing {
    public static final HashMap<String, Enum> map = new HashMap<>();

    public static void main(String[] args) {
        for (Enum e : Enum.values()) {
            map.put(e.toString().toLowerCase().split("_")[0], e);
        }

        System.out.println(map.get("persia").getString());
    }

    public enum Enum {
        GAUL_RAM("gaul_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        GAUL_RAM_UPGRADED("gaul_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),  
        GREEK_RAM("greek_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        GREEK_RAM_UPGRADED("greek_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        PERSIA_RAM("persia_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        PERSIA_RAM_UPGRADED("persia_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        CARTHAGE_RAM("carthage_ram.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0)),
        CARTHAGE_RAM_UPGRADED("carthage_ram_upgraded.schem", new Location(Bukkit.getWorld(Statics.worldName), 0, 100, 0));

        private String arg0;
        private Location arg1

        private Enum (String s, Location l) {
            arg0 = s;
            arg1 = l
        }

        public String getString() {
            return arg0;
        }

        public Location getLoc() {
            return arg1;
        }
    }
}

Это возвращает:

persia_ram_upgraded.schem

Обратите внимание, что это оставляет некоторую двусмысленность между некоторыми из ваших значений перечисления. Например, PERSIA_RAM и PERSIA_RAM_UPGRADED будут соответствовать строке "persia". Я бы порекомендовал либо переименовать, либо переосмыслить, как вы хотите получить доступ к своим значениям перечисления.

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