Как вернуть generi c Enum из метода, который принимает generi c Enum? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь написать служебный метод, который будет принимать enum любого типа и возвращать enum того же типа , но с другим значением.

Предположим, у меня есть следующие два enum:

enum Pet {
    DOG("Puppy"),
    CAT("Jazmine"),
    LIZARD("Spock");

    private final String value;

    Pet(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

enum Topping {
    PEPPERONI("Meat Saucers"),
    ONION("Like Ogres"),
    ANCHOVIES("Spicy Fish");

    private final String value;

    Topping(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

В моем приложении пользователю нужна возможность «редактировать» значение enum. Например, когда пользователь хочет отредактировать свой Pet, ему предоставляется список значений enum, и он может выбрать новое из этого списка.

Я пытаюсь сделать следующее: напишите один метод, который может обрабатывать любое количество различных типов enum (ie: и Pet, и Topping).

Поскольку я еще не очень хорошо знаком с дженериками, вот очень плохо "закодированный" пример того, что я пытаюсь сделать:

public static GenericEnumType changeValue(Enum<?> e) {
        
    // Present user with list of e.values(), user can select new value
    String newValue = getUserInput();
    return GenericEnumType.valueOf(newValue);
}

Есть ли способ выполнить sh такую ​​вещь? Из своего исследования я обнаружил, что получить значения из generi c enum может быть сложно, потому что метод values() фактически недоступен во время компиляции.

Ответы [ 3 ]

1 голос
/ 06 августа 2020
public static Enum<?> changeValue(Enum<?> e) {
    String newValue = getUserInput();
    return Enum.valueOf(e.getClass(), newValue);
}

Enum.valueOf может вызвать IllegalArgumentException и NullPointerException . Вы должны справиться с этим

0 голосов
/ 06 августа 2020

Я думаю, вы столкнулись с трудностями при поиске перечислений из данного перечисления. Затем вы можете использовать отражение, чтобы найти их. Далее вы узнаете, что я сделал.

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Arrays;

    public class Test {
        public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
            System.out.println(changeValue(Pet.DOG));

        }
        public static Enum changeValue(Enum<?> e) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {

            // Present user with list of e.values(), user can select new value
            Method method = e.getClass().getDeclaredMethod("values");
            Object obj = method.invoke(null);
            System.out.println(Arrays.toString((Object[]) obj));

            String newValue = getUserInput();
            return e.valueOf(e.getClass(),newValue);
        }

        private static String getUserInput() throws IOException {
            System.out.println("select one of the enum from list and enter the name");
            BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));
            String name = reader.readLine();
            return name;
        }
    }
    enum Pet {
        DOG("Puppy"),
        CAT("Jazmine"),
        LIZARD("Spock");

        private final String value;

        Pet(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }
    enum Topping {
        PEPPERONI("Meat Saucers"),
        ONION("Like Ogres"),
        ANCHOVIES("Spicy Fish");

        private final String value;

        Topping(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }
0 голосов
/ 06 августа 2020

Вы можете попробовать следующее:

    enum MyEnum1 { VALUE1, VALUE2 }
    enum MyEnum2 { VALUE3, VALUE4 }

    public static <E extends Enum<E>> E valueOf(
            Class<E> enumClass, String value) {
        return Enum.valueOf(enumClass, value);
    }

Then

System.out.println(valueOf(MyEnum1.class, "VALUE1"));

Обычно это то, что вы можете сделать, когда вам нужен метод, который принимает любые типы перечислений. В этом конкретном случае, поскольку вы только разбираете, можно просто использовать:

Enum.valueOf(MyEnum1.class, "VALUE1")
...