我有一个中等大小的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));我有上面的枚举。我可能会被传递一个值,比如“波斯”。然后,我要做的是从波斯常量PERSIA_RAM及其Location对象中提取字符串值。
然而,我没有看到一种“干净”的方式来做这件事。想到的解决方案是检查提供的字符串"persia",通过Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants().toString().toLowerCase();遍历枚举中的所有值,然后在下划线“_”上使用某种分隔符,以获得枚举常量中的第一个单词。
再说一次,这不是一个圆滑的解决方案。有没有更好的方法来完成这项任务?
发布于 2020-05-27 12:14:50
您可以在装入类时创建一个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"字符串。我建议您重命名,或者重新考虑如何访问枚举值。
https://stackoverflow.com/questions/62035033
复制相似问题