首页 > 解决方案 > 如何在java中触发静态代码的执行?

问题描述

我正在尝试构建的是具有更高级 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”。我该怎么做才能使它“包含=真”?

这个答案:为什么枚举的构造函数不能访问静态字段?显示从枚举构造函数访问静态字段有什么问题,我问的是从应该已经初始化的不同类访问枚举的静态值。

标签: javalambdaenums

解决方案


您可以通过对枚举执行任何调用来加载枚举类,例如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
要么使用单个类:仅使用枚举类,要么保留两个类,但要真正区分它们的职责。


推荐阅读