【发布时间】:2018-09-08 14:23:10
【问题描述】:
我正在尝试构建的是具有更高级 valueOf 方法的枚举类列表。由于该方法不能被覆盖并因此被扩展,我想创建一个类来保存所有具有高级ValueOf 方法的枚举并由 lambda 运行它。我面临的问题是枚举的注册是在静态代码中,这是在第一次检查枚举之后触发的。
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”。我该怎么做才能使它“包含=真”?
这个答案:Why can't enum's constructor access static fields? 显示了从枚举构造函数访问静态字段有什么问题,我问的是从应该已经初始化的不同类访问枚举的静态值。
【问题讨论】:
-
@nullpointer 超出了hack,有这种要求通常意味着您在设计中犯了一些错误。关于这一点我想回答一下。
-
我正在尝试使xmls可以接受诸如“DUAL_SWORD”和“Dual Sword”和“Dual”之类的值,但是枚举类仅在运行时才知道,因此我只能看到上述解决方案或调用“ advancedValueOf" 通过反射
-
@davidxxx 在这种情况下我们可以将其添加到原始帖子中吗?我不确定对这种方法的共识是什么,但如果应该在这里完成,请随时重新打开。
-
@nullpointer 我真的不知道,但由于 dup 不完全适合实际问题并且我已经同意,我重新打开。谢谢!
-
为什么枚举类需要向
EnumTest类注册自己?我建议将枚举与EnumTest类解耦,而是单独执行所需的注册,可能按照配置文件的指示。