Сравнить строку в ENUM - PullRequest
       2

Сравнить строку в ENUM

0 голосов
/ 22 февраля 2019

Я хочу реализовать сохранение включенных или отключенных функций в строке базы данных.Когда из сети поступает какое-то строковое значение, я бы хотел сравнить его с ENUM.

ENUM:

public enum TerminalConfigurationFeatureBitString {
    Authorize("authorize", 0), // index 0 in bit string
    Authorize3d("authorize3d", 1), // index 1 in bit String
    Sale("sale", 2), // index 2 in bit String
    Sale3d("sale3d", 3), // index 3 in bit String
}

Map<TerminalConfigurationFeatureBitString, Boolean> featureMaps =
    config.initFromDatabaseValue(optsFromDatabase);

featureMaps.get(transaction.transactionType);

Лучший способ - использовать featureMaps.get(TerminalConfigurationFeatureBitString.Sale);

Но я не знаю, какой будет входящая строка.

Теперь я получаю предупреждение Unlikely argument type String for get(Object) on a Map<TerminalConfigurationFeatureBitString,Boolean>

Есть ли другой способ сделать запрос в ENUM без знания ключа?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Подобно @ ответу Михаила , вы можете просто сгенерировать static справочную карту внутри вашей enum, которая отображает тип транзакции перечисления с фактическим перечислением:

private static final Map<String, TerminalConfigurationFeatureBitString> TRANSACTION_TYPE_TO_ENUM = 
   Arrays.stream(values()).collect(Collectors.toMap(
       TerminalConfigurationFeatureBitString::getTransactionType, 
       Function.identity()
   );

И затем есть метод поиска, также внутри перечисления:

public static TerminalConfigurationFeatureBitString getByTransactionType(String transactionType) {
    TerminalConfigurationFeatureBitString bitString = TRANSACTION_TYPE_TO_ENUM.get(transactionType);
    if(bitString == null) throw new NoSuchElementException(transactionType);
    return bitString;
}

Это более производительный способ, чем упомянутый ответ, потому что Map создается при первой загрузке enum (таккогда это первый раз упоминается).И, таким образом, итерация происходит только один раз.Также Map имеют довольно быстрое время поиска, так что вы можете сказать, что получение перечисления таким образом работает O (1) (при игнорировании начального времени вычисления O (n))

0 голосов
/ 22 февраля 2019

Вы можете расширить свой enum с помощью дополнительного статического метода, который попытается преобразовать заданный String в enum элемент:

enum TerminalConfigurationFeatureBitString {
    Authorize("authorize", 0), // index 0 in bit string
    Authorize3d("authorize3d", 1), // index 1 in bit String
    Sale("sale", 2), // index 2 in bit String
    Sale3d("sale3d", 3); // index 3 in bit String

    private final String value;
    private final int index;

    TerminalConfigurationFeatureBitString(String value, int index) {
        this.value = value;
        this.index = index;
    }

    public String getValue() {
        return value;
    }

    public int getIndex() {
        return index;
    }

    public static Optional<TerminalConfigurationFeatureBitString> fromValue(String value) {
        for (TerminalConfigurationFeatureBitString item : values()) {
            if (item.value.equals(value)) {
                return Optional.of(item);
            }
        }

        return Optional.empty();
    }
}

Если опция не найдена, вернуть Optional.empty().Если функция отсутствует, это означает, что String представление не представляет никакой функции.Использование:

public void test() {
    EnumMap<TerminalConfigurationFeatureBitString, Boolean> featureMaps = new EnumMap<>(
        TerminalConfigurationFeatureBitString.class);

    Optional<TerminalConfigurationFeatureBitString> feature = TerminalConfigurationFeatureBitString.fromValue("authorize");
    if (!feature.isPresent()) {
        System.out.println("Feature is not foudn!");
    } else {
        Boolean authorize = featureMaps.get(feature.get());
        if (authorize != null && authorize) {
            System.out.println("Feature is enabled!");
        } else {
            System.out.println("Feature is disabled!");
        }
    }
}
0 голосов
/ 22 февраля 2019

В подобных случаях я часто добавляю статический метод getByX, который выполняет поиск на основе свойства перечисления:

public enum BitString {
    //...

    public static Optional<BitString> getByTransactionType(String transactionType)
    {
        return Arrays.stream(values())
            .filter(x -> x.transactionType.equals(transactionType))
            .findFirst();
    }
}

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

enum TransactionStatus
{
    ENABLED, NOT_ENABLED, NOT_SUPPORTED
}

TransactionStatus status = BitString.getBygetByTransactionType(transaction.transactionType)
    .map(bitString -> featureMaps.get(bitString))
    .map(enabled -> enabled ? TransactionStatus.ENABLED : TransactionStatus.NOT_ENABLED)
    .orElse(TransactionStatus.NOT_SUPPORTED);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...