繁体   English   中英

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

[英]Retrieving Enum values from unknown 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 object。

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

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

您可以在加载 class 时创建一个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_RAMPERSIA_RAM_UPGRADED都会对应一个字符串"persia" 我建议要么重命名,要么重新考虑你想如何访问你的枚举值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM