作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个中等大小的枚举,我想从给定的字符串中检索值。例如,
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_RAM
和 PERSIA_RAM_UPGRADED
都对应于字符串 "persia"
。我建议要么进行一些重命名,要么重新考虑如何访问枚举值。
关于java - 从未知字符串中检索枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62035033/
我是一名优秀的程序员,十分优秀!