Я пытаюсь создать список перечислимых классов, которые получили более продвинутые методы 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 из другого класса, который должен иметь уже инициализирован.