Java String / Integer не разрешается в enum - PullRequest
0 голосов
/ 05 ноября 2019

У меня следующее перечисление в java

public enum TypeSignsEnum {

    NEGATIVE("45","17","11","66","31","56","85","14","15","91","30"),
    POSITIVE("58","26","97","12","89","18","22","19","20","16","25","92","10","14","24","60","65","79","57","27","23","96"),
    DEFAULT();

    TypeSignsEnum(String ...values) {
        List<String> values1 = Arrays.asList(values);
    }

}

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

Однако это всегда приведет к ошибке

java.lang.NullPointerException: Name is null

или в случае, если я попытаюсь использовать фактическое Integers

No enum constant com.xxx.zzz.yyy.model.TypeSignsEnum.11

(11 - третье слева, отрицательное перечисление ... )

Тот же код, но с Integers

public enum TypeSignsEnum {

    NEGATIVE(45, 17, 11, 66, 31, 56, 85, 14, 15, 91, 30),
    POSITIVE(58, 26, 97, 12, 89, 18, 22, 19, 20, 16, 25, 92, 10, 14, 24, 60, 65, 79, 57, 27, 23, 96),
    DEFAULT();

    TransactionTypeSignsEnum(Integer ...values) {
        List<Integer> values1 = Arrays.asList(values);
    }

}

Как мне сделать эту работу?

Дело в том, что другой класс вызывает valueOf(value), который должен быть либо ОТРИЦАТЕЛЬНЫМили ПОЗИТИВНО, но в настоящее время каждое значение является ошибкой

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Распространенный способ решения прецедента заключается в следующем:

  • хранить значения в приватном поле (перечисления в Java не являются простыми константами, они могут иметь поля и методы)
  • добавить общедоступный статический метод для поиска значения enum
public enum TypeSignsEnum {

    NEGATIVE(45, 17, 11, 66, 31, 56, 85, 14, 15, 91, 30),
    POSITIVE(58, 26, 97, 12, 89, 18, 22, 19, 20, 16, 25, 92, 10, 14, 24, 60, 65, 79, 57, 27, 23, 96),
    DEFAULT();

    private final HashSet<Integer> values;

    TypeSignsEnum(Integer ...values) {
        this.values = new HashSet<>(Arrays.asList(values));
    }

    public static TypeSignsEnum fromValue(int value) {
        for (TypeSignsEnum e : TypeSignsEnum.values()) {
            if (e.values.contains(value)) {
                return e;
            }
        }
        return DEFAULT;
    }

}

Использование:

System.out.println(TypeSignsEnum.fromValue(11));
0 голосов
/ 05 ноября 2019

11 не является значением TypeSignsEnum.

TypeSignsEnum имеет только 3 значения: POSITIVE, NEGATIVE и DEFAULT

Какой вспомогательный метод необходим для возврата перечисления, содержащего искомое значение:

enum TypeSignsEnum {

    NEGATIVE("45","17","11","66","31","56","85","14","15","91","30"),
    POSITIVE("58","26","97","12","89","18","22","19","20","16","25","92","10","14","24","60","65","79","57","27","23","96"),
    DEFAULT();

    private List<String> enumValues;

    TypeSignsEnum(String ...enumValues) {
        this.enumValues = Arrays.asList(enumValues);
    }

    public static TypeSignsEnum findByValue(String val) {
        return Arrays.stream(values())
                .filter(e -> e.enumValues.contains(val))
                .findFirst()
                .orElse(DEFAULT);
    }

}

Я переименовал ваш список в enumValues, чтобы вы не запутались в методе values(), который перечисляет все перечисления

TypeSignsEnum typeSignsEnumFor11 = TypeSignsEnum.findByValue("11");
System.out.println("typeSignsEnumFor11 = " + typeSignsEnumFor11);

typeSignsEnumFor11 = NEGATIVE

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