Java enum.valueOf (String) и enum.class - PullRequest
0 голосов
/ 22 мая 2018

У меня есть несколько перечислений, таких как:

public enum Season {
    SPRING, SUMMER, AUTUM, WINTER
}

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

Я пытаюсь написать общий метод для беспокойства.

private void doSomethingWithAnyEnum(Class enumClass,String checkThisProperty) 
{
  if(EnumUtils.isValidEnum(enumClass, checkThisProperty))
  {
    //here i should be able to call valueOf(String) method on enum
    //without bothering about the type coming in. 
  }
}

Чтобы я мог вызвать этот метод, например:

doSomethingWithAnyEnum(Days.class,"blah") ;
doSomethingWithAnyEnum(Seasons.class,"blah");

Я застрял на том, как передать перечисление и использовать его класс и имя в методе, используя одну и ту же вещь.Я пытался использовать simpleName(), но здесь это не работает.Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

EnumUtils от Apache Commons уже имеет метод для этого: getEnum.Поскольку вы уже используете его для isValidEnum, имеет смысл использовать его и для этого.

В сигнатуре вашего метода также должны использоваться обобщенные, а не необработанные типы для принудительного применения во время компиляции, что doSomethingWithAnyEnumвызывается с перечислением, а не со старым классом.Я также исправил это для вас.

private <E extends Enum<E>> void doSomethingWithAnyEnum(Class<E> enumClass,
                                                        String checkThisProperty)
{
    if (EnumUtils.isValidEnum(enumClass, checkThisProperty))
    {
        final E value = EnumUtils.getEnum(enumClass, checkThisProperty);
        System.out.println(value.name()); //or whatever else you want to do
    }
}

Без этого изменения сигнатуры метода я мог бы вызвать этот метод с помощью

doSomethingWithAnyEnum(String.class, "hello")

, и он завершится с ошибкой только во время выполнения.Лучше сделать проверку во время компиляции.

0 голосов
/ 22 мая 2018

Вы можете изменить свою функцию следующим образом:

public <T extends Enum<T>> void doSomethingWithAnyEnum(Class<T> tClass, String name) {
    T t  = Enum.valueOf(tClass, name);
}

Ваш оригинальный метод принял случайный Class enumClass тип класса, который принимает любой класс.Он будет генерировать исключения во время выполнения, когда обрабатывает входной класс как enum

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