Правильный способ поиска перечисления по значению

У меня есть несколько перечислений Java, которые выглядят примерно так, как показано ниже (отредактировано для конфиденциальности и т. д.). В каждом случае у меня есть метод поиска, который меня действительно не устраивает; в приведенном ниже примере это findByChannelCode .

public enum PresentationChannel {
    ChannelA("A"),
    ChannelB("B"),
    ChannelC("C"),
    ChannelD("D"),
    ChannelE("E");

    private String channelCode;

    PresentationChannel(String channelCode) {
        this.channelCode = channelCode;
    }

    public String getChannelCode() {
        return this.channelCode;
    }

    public PresentationChannel findByChannelCode(String channelCode) {
        if (channelCode != null) {
            for (PresentationChannel presentationChannel : PresentationChannel.values()) {
                if (channelCode.equals(presentationChannel.getChannelCode())) {
                    return presentationChannel;
                }
            }
        }

        return null;
    }
}

Проблема в том, что мне кажется глупым выполнять этот линейный поиск, когда я мог бы просто использовать HashMap . Итак, я подумал о решении, приведенном ниже, но оно немного сложнее, чем я бы надеялся, и, что более важно, я не хотел заново изобретать колесо, когда наверняка кто-то другой столкнулся с этим. Я хотел проникнуться мудростью этой группы: как правильно индексировать перечисление по значению?

Мое решение:

ImmutableMap<String, PresentationChannel> enumMap = Maps.uniqueIndex(ImmutableList.copyOf(PresentationChannel.values()), new Function<PresentationChannel, String>() {
        public String apply(PresentationChannel input) {
            return input.getChannelCode();
        }});

и в перечислении:

public static PresentationChannel findByChannelCode(String channelCode) {
     return enumMap.get(channelCode);
}
11
задан Ray 3 February 2011 в 13:54
поделиться