Можно ли получить значение Enum по строке из нескольких перечислений? - PullRequest
0 голосов
/ 19 января 2020

Если у меня есть:

Enum firstEnum(){
  A("a"), B("b");
}


Enum secondEnum(){
  C("c"),D("d");
}

Как я могу получить значение enum по строке из двух различных перечислений? Мне нужно использовать его в методе.

Enum<?> myEnum = [METHOD THAT GETS ENUM BY STRING FROM TWO DIFFRENT ENUMS];

Ответы [ 3 ]

0 голосов
/ 19 января 2020

Здесь возможно решение вашего конкретного c вопроса. Обратите внимание на метод:

Enum myEnum = getEnumValueFromTwoDifferentEnumsByName (FirstEnum.class, SecondEnum.class, enumValueName);

    public enum FirstEnum {
        A, B;
    }

    public enum SecondEnum {
        C, D;
    }
    //Enums will throw NPE when the value is not found so we have to handle this first
    public static Enum<?> getEnumValueNoException(Class<? extends Enum> enumeration, String valueName) {
        try {
            return Enum.valueOf(enumeration, valueName);
        } catch (NullPointerException e) {
            return null;
        }
    }

    public static Enum<?> getEnumValueFromTwoDifferentEnumsByName(Class<? extends Enum> enum1, Class<? extends Enum> enum2, String enumValueName) {
        Enum<?> possibility1 = getEnumValueNoException(enum1, enumValueName);
        Enum<?> possibility2 = getEnumValueNoException(enum2, enumValueName);

        if (possibility1 == null && possibility2 == null) {
            throw new NullPointerException("Found no valid enum values for name " + enumValueName + " in enums " + enum1 + " and " + enum2);
        }

        return possibility1  != null ? possibility1 : possibility2;
    }

    public static void main(String[] args) throws Exception {
        String enumValueName = "A";
        Enum<?> myEnum = getEnumValueFromTwoDifferentEnumsByName(FirstEnum.class, SecondEnum.class, enumValueName);
        System.out.println(myEnum);
    }
0 голосов
/ 20 января 2020

Один из упрощенных способов поиска предопределенной пары перечислений - сделать

FirstEnum fe = Arrays.stream(FirstEnum.values()).filter(item -> item.toString().equals("C"))
    .findAny()
    .orElse(null);

, а если результат равен null, сделать то же самое для SecondEnum.

Примечание. что я сравниваю, используя toString, который вы, возможно, захотите заменить, если это переменные перечисления ("a", "b" et c), которые вы хотите сопоставить

0 голосов
/ 19 января 2020

Вы можете сделать что-то вроде этого:

import java.util.ArrayList;
import java.util.List;

interface ValueProvider{
    public String getValue();
}
enum FirstEnum implements ValueProvider {
    A("a"), B("b");
    private String value;
    FirstEnum(String s) {
        this.value=s;
    }
    public String getValue(){
        return value;
    }
}

enum SecondEnum implements ValueProvider{
    C("c"), D("d");
    private String value;
    SecondEnum(String s){
        this.value=s;
    }
    public String getValue(){
        return value;
    }
}

public class enumTest {
    public static void main(String[] args) {
        ArrayList<ValueProvider> al = new ArrayList<ValueProvider>();
        al.add(FirstEnum.A);
        al.add(SecondEnum.C);
        al.add(FirstEnum.B);
        al.add(SecondEnum.D);
        listEnumValues(al);
    }
    public static void listEnumValues(List<ValueProvider> al){
        for(var e:al){
            System.out.println(e.getValue());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...