我和朋友正在制作纸牌游戏,我决定制作一个卡片查看器,我们将所有卡片详细信息输入到文本文档中,我的程序逐行读取每张卡片。
不同类型的卡具有不同的属性,所有属性都以某种类型的枚举表示。
我有一些代码可以将字符串列表转换为枚举属性列表。示例枚举:
public enum Race{
ELVES, HUMANS, DWARFS
}
public enum Rarity{
COMMON, UNCOMMON, RARE
}
假设一张牌可以有多个种族和多种稀有,我想制作一个方法,可以获取一个字符串列表和一种枚举类型,并返回一个枚举值列表,例如
// Take in an array of strings and a type of Enum value to convert them to
public <Type extends Enum<Type>> Type[] getValues(String[] strings){
// Make an array to hold the enum values
Type[] values = new Type[strings.length];
// For each string, convert it into an enum value and add it to the array
for (int i = 0; i < strings.lenght; i++)
values[i] = Type.valueOf(strings[i]);
return values;
}
我知道这个方法不起作用,但我希望它至少描绘了我想要做的事情,我想要一个方法,我可以发送任何字符串列表,它会将它们转换为一个列表EnumValues,例如将字符串{“ELVES”,HUMANS“}转换为相关的种族价值{ELVES,HUMANS}。
你可能会问为什么我不只是制作像
这样的单独方法convertRaceStings(String[] strings){//method workings here}
convertRarityStings(String[] strings){//method workings here}
不幸的是,这里使用的两个枚举是简单的例子,还有更多的枚举,每个枚举都需要另一种方法。
答案 0 :(得分:4)
您应该使用EnumSet而不是枚举数组。它更有内存效率。 作为奖励,您不必混淆泛型数组。
您的方法将如下所示:
private static <T extends Enum<T>> EnumSet<T> createEnumSet(Class<T> clazz, String... values) {
EnumSet<T> set = EnumSet.noneOf(clazz);
for(String value : values) {
set.add(Enum.valueOf(clazz, value));
}
return set;
}
好吧,除非您需要具有相同枚举的多个实例。
用法:
final EnumSet<Race> races = createEnumSet(Race.class, "HUMANS", "DWARFS");
答案 1 :(得分:2)
如果您传递枚举类型会更容易 - 这将使您能够使用Enum#valueOf
static method:
public static void main(String[] args) {
System.out.println(get("ELVES", Race.class));
System.out.println(get("COMMON", Rarity.class));
}
public static <T extends Enum<T>> T get(String value, Class<T> clazz) {
return Enum.valueOf(clazz, value);
}
public static enum Race {
ELVES, HUMANS, DWARFS
}
public static enum Rarity {
COMMON, UNCOMMON, RARE
}
如果您不想将枚举类作为第二个参数传递,则需要在某处维护映射。
答案 2 :(得分:2)
在通用代码中使用数组有点烦人。
@SuppressWarnings("unchecked")
public <E extends Enum<E>> E[] getValues(Class<E> clazz, String[] strings) {
E[] result = (E[])java.lang.reflect.Array.newInstance(clazz, strings.length);
for (int i = 0; i < strings.length; ++i) {
result[i] = Enum.valueOf(clazz, strings[i]);
}
return result;
}
这应该有用。
答案 3 :(得分:0)
Java中的枚举非常强大。由于枚举是常量且无法动态添加,因此您可以执行以下操作:
public enum Race {
ELVES, HUMANS, DWARFS;
public static Race getValue(String name) {
switch (name.toLowerCase()) {
case "evles": return EVLES;
case "humans": return HUMANS;
case "dwarfs": return DWARFS;
default: throw new Exception();
}
}
}
这假设您使用的是Java 7,但如果没有,请将该开关替换为else-if语句。