【问题标题】:Write method that takes/returns enum constants of any enum编写获取/返回任何枚举的枚举常量的方法
【发布时间】:2017-06-22 23:41:03
【问题描述】:

当我存储一个配置枚举时,这很容易,只要它类型绑定到一个特殊的枚举类型MyEnum

void storeMyEnumValue(MyEnum value) {
    String valueString = value.name();
    // Store valueString somewhere
}

MyEnum loadMyEnumValue(MyEnum fallbackValue) {
    // Load valueString from somewhere
    try {
        return MyEnum.valueOf(valueString);
    } catch (Exception e) {
        return fallbackValue;
    }
}

但是,如果我想概括它并为任何类型的枚举提供一组 store/load 方法呢?

void storeAnyEnumValue(??? value) {
    // The same as before
}

??? loadAnyEnumValue(??? defaultValue) {
    // The same as before
}

如您所见,问题主要是如何处理“枚举常量类型的对象”。

【问题讨论】:

  • Enum 是所有枚举类型的基类,你可以使用它。
  • 你在MyEnum上调用一个静态方法,你必须注入它。
  • 我想过这个,但是我会从loadAnyEnumValue 函数中得到一个Enum,不管我的参数是什么类型,还是我想错了?
  • 使用泛型,看我的回答
  • 你接受了正确的:)

标签: java generics enums


【解决方案1】:

对于 store 方法,您可以只使用 Enum<?> 的实例。类型变量在这里没有任何优势。

void storeAnyEnumValue(Enum<?> value) {
    // The same as before
}

对于加载方法,您希望返回类型与defaultValue 的类型相同,因此您需要一个类型变量:

<E extends Enum<E>> E loadAnyEnumValue(E defaultValue) {
    // The same as before
}

【讨论】:

    【解决方案2】:

    怎么样

    void storeAnyEnumValue(Enum<?> value) {
        // The same as before
    }
    
    <T extends Enum<T>> T loadAnyEnumValue(T defaultValue) {
        // Not exactly the same as before
    }
    

    【讨论】:

    • &lt;T extends Enum&lt;T&gt;&gt;: 不要使用原始类型。
    • 值得一提的是,第二种方法的实现与之前的不同
    • 好点,会使用(T) Enum.valueOf(defaultValue.getDeclaringClass(), valueString)
    • 你不需要未经检查的演员(T),表达式Enum.valueOf(defaultValue.getDeclaringClass(), valueString)在像&lt;T extends Enum&lt;T&gt;&gt; T loadAnyEnumValue(T defaultValue) { return …; }这样的通用上下文中使用时已经返回正确的类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2015-08-21
    相关资源
    最近更新 更多