проверка, существует ли перечисление - PullRequest
0 голосов
/ 07 мая 2020

У меня есть:

@AllArgsConstructor
public enum EnumTest {

    ENUM_TEST1(1),
    ENUM_TEST2(2),
    ENUM_TEST3(3),
    ENUM_TEST4(4),
    ENUM_TEST5(5),
    ENUM_TEST6(6),
    ENUM_TEST7(7),
    ENUM_TEST8(8),
    ENUM_TEST9(9),
    ENUM_TEST10(10);

    private int value;

}

Я хотел бы проверить, находится ли параметр внутри перечисления, я могу сделать это:

EnumUtils.isValidEnum(EnumTest.class,"ENUM_TEST6");

, но каков будет правильный способ сравните только некоторое перечисление, например, у меня есть это:

Arrays.asList(ENUM_TEST6,ENUM_TEST7).contains(newParam.getEnumTest());

, но asList использует (новый), поэтому было бы правильно сделать что-то вроде этого, чтобы немного улучшить производительность, или какой лучший способ вы можете придумать?

ENUM_TEST6.equals(newParam.getEnumTest()) || ENUM_TEST7.equals(newParam.getEnumTest());

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Не используйте Arrays.asList(ENUM_TEST6,ENUM_TEST7), вместо этого используйте EnumSet:

EnumSet.of(ENUM_TEST6, ENUM_TEST7)

Если это что-то повторно используемое, добавьте его в enum:

@AllArgsConstructor
public enum EnumTest {

    ENUM_TEST1(1),
    ENUM_TEST2(2),
    ENUM_TEST3(3),
    ENUM_TEST4(4),
    ENUM_TEST5(5),
    ENUM_TEST6(6),
    ENUM_TEST7(7),
    ENUM_TEST8(8),
    ENUM_TEST9(9),
    ENUM_TEST10(10);

    private int value;

    private static final EnumSet<EnumTest> TEST_6_7 = EnumSet.of(ENUM_TEST6, ENUM_TEST7);

    public static boolean is6or7(EnumTest value) {
        return TEST_6_7.contains(value);
    }
}
0 голосов
/ 07 мая 2020

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

  • EnumSet.complementOf
  • EnumSet.allOf
  • EnumSet.noneOf
    public static void main(String[] args) {
        method(EnumSet.of(EnumTest.ENUM_TEST1, EnumTest.ENUM_TEST2));

    }   
    public static void method(EnumSet<EnumTest> eset) {
        if (eset.containsAll(EnumSet.of(EnumTest.ENUM_TEST1,EnumTest.ENUM_TEST2))) {
            // do something.
        }
    }
0 голосов
/ 07 мая 2020

Если коллекция допустимых перечислений очень велика, вам нужно go с реализацией asList, но создать и сохранить этот список в соответствующей области для повторного использования. Если набор действительных перечислений невелик (скажем, 2-5), использование списка (или другой коллекции) делает много ненужной работы.

Но вам нужно будет скорректировать код, если getEnumTest отвечает на строку, ни contains, ни equals не будут работать. Коллекция будет состоять из имен перечислений: ENUM_TEST6.name().

Кроме того, если набор действительных перечислений очень большой, лучше будет HashSet, так как List.contains в базовом c реализации (скажем, ArrayList) будут медленными для больших коллекций.

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