我有一个中等大小的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();
遍历枚举中的所有值,然后在下划线'_'上使用某种定界符以获取枚举常量中的第一个单词。
同样,这不是一个巧妙的解决方案。有没有更好的方法来完成此任务?
您可以在加载类时创建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_RAM
和PERSIA_RAM_UPGRADED
都将对应于"persia"
的字符串。我建议您重命名或重新考虑如何访问枚举值。