从字符串解析通用枚举集的 Java 静态方法

标签 java generics enums set

我有很多类定义了一些枚举,我希望从用户输入的字符串加载其值。所以我发现自己在重复这个方法:

public final class Status {
    public static enum TYPE { Slow, Haste, Sleep, Stop, Stone, Invis, Rage,
        Conf, Bleed, Weak, Dumb, Sil, Rot, Lev, Clumsy };

    public static Set<Status.TYPE> typesFromString(String string) { 
        EnumSet<Status.TYPE> set = EnumSet.noneOf(Status.TYPE.class);
        if (string == null)
            return set;
        String[] elements = string.split(",");
        for (String element : elements) {
            element = element.trim();
            for (TYPE type : EnumSet.allOf(Status.TYPE.class)) {
                if (type.toString().equalsIgnoreCase(element)) {
                    set.add(type);
                    break;
                }
            }
        }
        return set;
    }

也就是说,给定一个包含与枚举条目匹配的逗号分隔元素的字符串,返回一个由每个匹配项填充的集合。

我很想使这个通用,所以我不必维护它的十个不同副本,但我不太清楚如何在返回一组枚举的同时使这个通用。我认为它看起来隐约类似于以下方法:

public static Set<[Enum Class Specified in Argument]> setFromString(String string, [Class of Enum to Work With]) {
    Set<E extends Enum<E>> set = EnumSet.noneOf([Class of Enum]);
    if (string == null)
        return set;
    for (String element : string.split(",")) {
        element = element.trim().toLowerCase();
        for ([Element of Enum] type : EnumSet.allOf([Class of Enum])) {
            if (type.toString().trim().toLowerCase().equals(element))
                set.add(type);
        }
    }
}
return set;

最佳答案

您需要在修饰符 ( <E extends Enum<E> ) 和返回值 ( public static ) 之间指定泛型参数 ( Set<E> )。并将 Class 作为参数传递枚举( Class<E> clazz`)。应该看起来像这样:

    public static <E extends Enum<E>> Set<E> parseValues(
        String string, Class<E> clazz
    ) { 
        EnumSet<E> set = EnumSet.noneOf(clazz);
        if (string == null) {
            return set; // ( better, NPE )
        }
        String[] elements = string.split(",");
        for (String element : elements) {
            element = element.trim();
            for (E type : EnumSet.allOf(clazz)) {
                if (type.name().equalsIgnoreCase(element)) {
                    set.add(type);
                    break;
                }
            }
            // ( Do we really want to ignore spurious values? )
        }
        return set;
    }

(未经测试或编译。)

关于从字符串解析通用枚举集的 Java 静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26959710/

相关文章:

java - 为什么 CXF WSDLToJava 的 Ant/Ivy 集成不起作用?

在 Centos 6.4/Open JDK 1.7.0 上运行 Spring Boot jar 时出现 java.io.IOException

java - 如何从 spring mvc 中的 Controller 名称+ Action 名称获取映射的 URL?

java - 自定义 TextToSpeechService 中的错误突出显示

c# - 将带有换行符的文本转换为列表<String>

c++ - C++ 枚举访问语义背后的基本原理

java - 在字节码层面,Java的Class.getEnumConstants()如何知道哪些类是枚举类?

c# - 将方法概括为 'Get' 任何对象属性

java - 泛型 <? super A> 不允许将 A 的父类(super class)型添加到列表中

PostgreSQL:更改枚举类型的列