gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:00 24 4
gpt4 key购买 nike

我正在尝试为一组枚举类编写一些 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com