【问题标题】:How to trigger execution of static code in java?如何在java中触发静态代码的执行?
【发布时间】: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 类解耦,而是单独执行所需的注册,可能按照配置文件的指示。

标签: java lambda enums


【解决方案1】:

您可以通过对枚举执行任何调用,例如 Enum.values() 来加载枚举类:

public static void main(String[] args){
    SimpleEnum.values();  // hack to load the enumeration class
    getValue(SimpleEnum.class, "1");
}

但这是一个 hack:不可读并且很容易被更改破坏,因为这是两个不同的类。
我认为EnumTestSimpleEnum 之间的分离过于人为,它们的有效耦合太高:SimpleEnum 依赖于EnumTest,而EnumTest 本身又依赖于SimpleEnum
要么使用单个类:仅使用枚举类,要么保留两个类,但要真正区分它们的职责。

【讨论】:

  • 在我的示例中,我已将 EnumTest 设置为负责检查值并保存枚举,但这里只是为了尽可能缩短代码。也不可能将所有内容都放在一个枚举中,因为我有几个使用“advancedValueOf”方法的枚举。
猜你喜欢
  • 1970-01-01
  • 2011-03-28
  • 2014-12-07
  • 2020-12-07
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多