Как запустить выполнение статического кода в Java? - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь создать список перечислимых классов, которые получили более продвинутые методы valueOf. Поскольку этот метод не может быть перезаписан и, следовательно, расширен, я подумал создать класс, содержащий все перечисления, которые имеют методы advancedValueOf, и запустить его с помощью лямбды. Проблема, с которой я сталкиваюсь, заключается в том, что регистрация перечисления выполняется в статическом коде {}, который запускается ПОСЛЕ того, как перечисление проверяется впервые.

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"?

Этот ответ: Почему конструктор enum не может получить доступ к статическим полям? показывает, что не так с доступом к статическому полю из конструктора enum. Я спрашиваю о доступе к статическому значению enum из другого класса, который должен иметь уже инициализирован.

1 Ответ

0 голосов
/ 08 сентября 2018

Вы можете сделать загрузку класса enum раньше, выполнив любой вызов enum, например Enum.values():

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

Но это хак: не читается и легко ломается при изменении, поскольку это два разных класса.
Я думаю, что разделение между EnumTest и SimpleEnum слишком искусственное, а их эффективная связь слишком высока: SimpleEnum зависит от EnumTest, что само по себе зависит от SimpleEnum.
Либо используйте один класс: просто enum класс, либо оставьте свои два класса, но проведя реальное различие между их обязанностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...