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

标签 java enums

我有一个中等大小的枚举,我想从给定的字符串中检索值。例如,

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 常量 PERSIA_RAM 中提取字符串值,以及它的Location对象。

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

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

最佳答案

您可以在加载类时创建一个 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"。我建议要么进行一些重命名,要么重新考虑如何访问枚举值。

关于java - 从未知字符串中检索枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62035033/

相关文章:

java - Java 中的多位 TCP 请求

具有多个数据类型字段的 Java 枚举?

c++ - 强制使用不正确的枚举值?

java - 使用 Spring 注入(inject)资源的构建器模式

Java 插件未附加到 Eclipse 中的调试 session

c# - Ruby - 枚举文件

c# - 在 C# 中,有没有办法同时定义枚举和该枚举的实例?

c# - 如何设置包含 *、/、-、% 和 + 等字符的枚举列表

java - Java 中的 OpenPGP 公钥导入

java - 如何从另一个类(使用 ViewHolder)调用 MainActivity 中的方法?