我要构建的是具有更高级valueOf方法的枚举类的列表。由于该方法无法覆盖并因此可以扩展,因此我考虑过创建一个包含所有具有advancedValueOf方法的枚举的类,并由lambda运行它。我面临的问题是,枚举的注册是在static {}代码中进行的,这是在首次检查枚举后触发的。
public enum SimpleEnum
{
ONE,
TWO;
static
{
EnumTest.registerEnum(SimpleEnum.class, SimpleEnum::advancedValueOf);
}
public static SimpleEnum advancedValueOf(String s)
{
return ONE;//This method would find enum by its parameters
}
}
//------------------------------------------------
public class EnumTest
{
private static final Map<Class<?>, Function<String, ?>> _advancedValueOfEnums = new HashMap<>();
public static void main(String[] args)
{
getValue(SimpleEnum.class, "1");
}
public static <T extends Enum<T>> void registerEnum(Class<T> enumClass, Function<String, T> advancedValueOf)
{
_advancedValueOfEnums.put(enumClass, advancedValueOf);
}
public static void getValue(Class<?> enumClass, String value)
{
System.out.println("Contains=" + _advancedValueOfEnums.containsKey(enumClass));
}
}
打印到控制台的消息为“ Contains = false”。我该怎么做才能使其“ Contains = true”?
这个答案:Why can't enum's constructor access static fields?显示了从枚举构造函数访问静态字段有什么问题,我问的是从另一个应该已经初始化的类中访问枚举的静态值。
答案 0 :(得分:1)
您可以通过对枚举执行任何调用,例如Enum.values()
来使枚举类加载:
public static void main(String[] args){
SimpleEnum.values(); // hack to load the enumeration class
getValue(SimpleEnum.class, "1");
}
但这是一个hack:这是两个不同的类,因此不可读且不易被更改破坏。
我认为EnumTest
和SimpleEnum
之间的分隔太人为,它们的有效耦合也太高:SimpleEnum
取决于EnumTest
,而它本身取决于SimpleEnum
。 br />
可以使用一个类:只使用枚举类,或者保留两个类,但要真正区分它们的职责。