java - 如何编写一组都应支持公共(public)静态方法的枚举类

标签 java enums

我正在尝试为一组枚举类编写一些 Java 代码。

每个枚举都封装了一些概念上不同的数据,因此将它们组合起来没有意义。枚举还映射到数据库中的值,因此也共享一些与从数据库加载数据相关的常见操作,包括实例操作和静态操作。

我需要概括我拥有的枚举类集,这样我就可以将这些枚举中的任何一个传递给不同的类,该类执行和缓存与每个不同枚举相关的数据库查找。

由于缓存/查找类还将依赖于每个枚举中定义的公共(public)和静态方法,我如何编写我的解决方案才能保证可以传递到类中的任何枚举都具有所需的方法?

通常的方法是定义一个接口(interface),但接口(interface)不允许静态方法。

或者,您可以使用抽象类来定义接口(interface)和一些常见的实现,但我不认为枚举是可能的(我知道枚举必须扩展 Enum 类并且不能扩展)。

我有哪些选择可以确保我的所有枚举都实现我需要的方法?

示例枚举:

public enum MyEnum{
    VALUE_ONE("my data");
    VALUE_TWO("some other data");

    /**
     * Used when mapping enums to database values - if that sounds odd, 
     * it is: it's legacy stuff
     *
     * set via private constructor
     */
    private String myValue; 
    //private constructor not shown

    public static MyEnum lookupEnumByString(String enumValue){
        //find the enum that corresponds to the supplied string
    }

    public String getValue(){
        return myValue;
    }
}

最佳答案

这一切都很复杂,可能会有错误,但我希望你能理解。

// I'm not sure about the right type arguments here
public interface MyEnumInterface<E extends MyEnumInterface & Enum<E>> {
    public static boolean aUsefulNonStaticMethod();
    String getValue();
    MyEnumInfo<E> enumInfo();
}

/** contains some helper methods */
public class MyEnumInfo<E extends MyEnumInterface<E>> {
    private static <E extends MyEnumInterface<E>> MyEnumInfo(Class<E> enumClass) {...}
    // static factory method
    public static <E extends MyEnumInterface<E>> MyEnumInfo<E> infoForClass(Class<E> enumClass) {
        ... return a cached value
    }
    public static <E extends MyEnumInterface<E>> MyEnumInfo(E e) {
         return infoForClass(e.getClass());
    }
    // some helper methods replacing static methods of the enum class     
    E enumForValue(String value) {....}
}

public enum MyEnum implements MyEnumInterface<MyEnum> {
    VALUE_ONE("my data");
    VALUE_TWO("some other data");

    private String myValue; //set via private constructor
    //private constructor not shown

    public boolean aUsefulNonStaticMethod(){
        //do something useful
    }

    public String getValue(){
        return myValue;
    }

    // the ONLY static method in each class
    public static MyEnumInfo<E> staticEnumInfo() {
        return MyEnumInfo.infoForClass(MyEnumClass.class);
    }
    // the non-static version of the above (may be useful or not)
    public MyEnumInfo<E> enumInfo() {
        return MyEnumInfo.infoForClass(getClass());
    }
}

有点奇怪,除了 Enum.name() 之外,您还使用了另一个 String,您需要它吗?

因为所有的枚举都扩展了 Enum,你不能让它们共享任何代码。您能做的最好的事情就是将它全部委托(delegate)给实用程序类中的辅助静态方法。

没有办法强制类实现静态方法,这是可以理解的,因为没有办法(除了反射)调用它们。

关于java - 如何编写一组都应支持公共(public)静态方法的枚举类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4923587/

相关文章:

java - (Java 中的线程池)增加线程数会导致简单 for 循环变慢。为什么?

java - Spring boot slf4j/log4j 禁用每日 RollingFilePolicy

c# - 如何在泛型方法中获取枚举的数据值?

c# - 当顺序不同时,将枚举转换为枚举不起作用

java - 对象数组

java - 使用 WS-Trust 与 Axis2 互操作的 WCF

Python.Runtime.PythonException : since Python. NET 3.0 int 无法隐式转换为 Enum。使用枚举(int_value)

c# - 使用 Automapper 覆盖现有映射

java - 检查多个值的枚举

JavaFX 自定义绑定(bind)不起作用