0

我正在和一个朋友制作纸牌游戏,我决定制作一个纸牌查看器,我们将所有纸牌详细信息输入到一个文本文档中,我的程序逐行读取每张纸牌。

不同类型的卡片具有不同的属性,所有属性都以某种类型的枚举表示。

我有一些将字符串列表转换为枚举属性列表的代码。示例枚举:

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"} 转换为相关的 Race 值 {ELVES, HUMANS}。

你可能会问为什么我不只是制作单独的方法,比如

convertRaceStings(String[] strings){//method workings here}
convertRarityStings(String[] strings){//method workings here}

不幸的是,这里使用的两个枚举只是简单的例子,还有更多的枚举,每个都需要另一种方法。

4

4 回答 4

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");
于 2013-06-18T14:12:24.327 回答
3

在泛型代码中使用数组有点烦人。

@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;
}

这应该有效。

于 2013-06-18T14:03:17.440 回答
2

如果您也传递枚举类型会更容易 - 这将使您能够使用Enum#valueOf静态方法

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
}

如果您不想将枚举类作为第二个参数传递,则需要在某处维护映射。

于 2013-06-18T13:59:33.350 回答
-1

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,但如果不是,请将 switch 替换为 else-if 语句。

于 2013-06-18T13:59:42.680 回答