从未知字符串中检索枚举值

问题描述 投票:0回答:1

我有一个中等大小的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));

我有上面的枚举。我可能会传递“ persia”之类的值。然后,我要从波斯常量PERSIA_RAM及其Location对象中提取String值。

但是,我看不到这样做的“干净”方法。想到的解决方案是检查提供的字符串“ persia”,通过Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants().toString().toLowerCase();遍历枚举中的所有值,然后在下划线'_'上使用某种定界符以获取枚举常量中的第一个单词。

同样,这不是一个巧妙的解决方案。有没有更好的方法来完成此任务?

java enums
1个回答
0
投票

您可以在加载类时创建String的HashMap来枚举,因此您不必每次要查找枚举值时都进行字符串操作。以下是我如何执行此操作的示例:

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_RAMPERSIA_RAM_UPGRADED都将对应于"persia"的字符串。我建议您重命名或重新考虑如何访问枚举值。

© www.soinside.com 2019 - 2024. All rights reserved.