Обратный поиск для Java Enums с более чем одним значением на ключ / константу?

С таким перечислением, где каждый ключ имеет несколько значений

ABBR1("long text 1", "another description 1", "yet another one 1"), 
ABBR2("long text 2", "another description 2", "yet another one 2"), 
//and so on...

Как я могу отменить поиск аббревиатуру (константу), вызвав метод, как getAbbreviation(descriptionText)?

Я в основном ищу реализацию, как описано здесь, я думаю, но с той разницей, что каждый ключ ENUM (константа) имеет несколько значений, и я хочу, чтобы он работал с getAbbreviation("long text 1") а также с getAbbreviation("yet another one 2")...

Есть ли простой способ зацикливаться на каждом ENUM (т.е. ABBRns) поля значений, чтобы заполнить гигантскую карту, или, может быть, есть даже лучшее решение?

3 ответа

Решение

Это зависит от того факта, что конструкторы-члены enum запускаются перед статическим инициализатором. Затем инициализатор кэширует элементы и их длинные формы.

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public enum Abbreviation {
    ABBR1("long text 1", "another description 1", "yet another one 1"), 
    ABBR2("long text 2", "another description 2", "yet another one 2"); 

    private static final Map<String, Abbreviation> ABBREVIATIONS = new HashMap<>();

    private String[] longForms;
    private Abbreviation(String... longForms) {
        this.longForms = longForms;
    }

    public String toString () {
        return Arrays.toString(longForms);
    }

    static {
        for(Abbreviation abbr : values()) {
            for(String longForm : abbr.longForms) {
                ABBREVIATIONS.put(longForm, abbr);
            }

        }
    }

    public static Abbreviation of(String longForm) {
        Abbreviation abbreviation = ABBREVIATIONS.get(longForm);
        if(abbreviation == null) throw new IllegalArgumentException(longForm + " cannot be abbreviated");
        return abbreviation;
    }



    public static void main(String[] args) {
        Abbreviation a =  Abbreviation.of("yet another one 2");
        System.out.println(a == Abbreviation.ABBR2); //true
    }
}

Каждое перечисление имеет метод values ​​(), так что вы можете сделать так:

for(YourEnum type : values()){
        if(/*is Equal to Your descriptionText*/){
             return type;
        }
    }
    throw new IllegalArgumentException("No such BailiffPaymentStatus:"+dbRepresentation);

Я думаю, что решение от: cPu1 находится на правильном пути. Однако существует более прямой способ заполнения HashMap по мере использования решения из этого вопроса.

Кроме того, вам не нужен частный longForms строковый массив для функции toString(), так как все значения в любом случае сохраняются в Map.

Другие вопросы по тегам