Преобразование строк в перечисления с пользовательскими именами в Groovy - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь преобразовать String в перечисление в Groovy, но я хочу использовать имя, отличное от буквального имени перечисления.

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

enum Breed {
    HUSKY('Husky'),
    LABRADOR('Labrador'),
    POODLE('Poodle')

    private final String name

    Breed(String name) {
        this.name = name
    }

    String toString() {
        name
    }
}

В его нынешнем виде я могу получить Breed со следующим кодом:

Breed breed = 'HUSKY' as Breed

Однако я хотел бы иметь возможность переопределить это вместо этого использовать поле имени следующим образом:

Breed breed = 'Husky' as Breed

Есть ли способ, который я могу реализовать или переопределить в этом перечислении, чтобы сначала проверить поле имени? В идеале я бы хотел избежать необходимости переопределять метод asType в String для достижения желаемого поведения.

1 Ответ

3 голосов
/ 24 апреля 2020

Я бы go для внутреннего поиска:

  • предоставляем справочную таблицу
  • добавляем помощник для получения элемента по ключу

Например,

enum Breed {
    HUSKY('Husky'),
    LABRADOR('Labrador'),
    POODLE('Poodle')

    private final String name

    Breed(String name) {
        this.name = name
    }

    public static final LUT = Breed.values().collectEntries{ [it.name, it] }.asImmutable()

    static from(String name) { 
        assert LUT.containsKey(name)
        LUT.get(name) 
    }
}

assert Breed.from("Husky") == Breed.HUSKY
...