Mam kilka wyliczeń Java, które wygląda mniej więcej poniżej (edytowane dla poufności, itp.). W każdym przypadku mam metodę wyszukiwania, z której naprawdę nie jestem zadowolony; w poniższym przykładzie jest to findByChannelCode
.Właściwy sposób wyszukiwania wyliczenia według wartości
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;
}
}
Problem polega na tym, czuję się głupio robi te liniowe wyszukiwań kiedy może być po prostu za pomocą HashMap<String, PresentationChannel>
. Pomyślałem więc o rozwiązaniu poniżej, ale jest trochę bardziej zawikłane, że mam nadzieję i, co ważniejsze, nie chciałem ponownie wymyślać koła, gdy na pewno ktoś inny natknął się na to. Chciałem zdobyć trochę mądrości tej grupy: jaki jest właściwy sposób indeksowania wyliczenia według wartości?
Moje rozwiązanie:
ImmutableMap<String, PresentationChannel> enumMap = Maps.uniqueIndex(ImmutableList.copyOf(PresentationChannel.values()), new Function<PresentationChannel, String>() {
public String apply(PresentationChannel input) {
return input.getChannelCode();
}});
, aw ENUM:
public static PresentationChannel findByChannelCode(String channelCode) {
return enumMap.get(channelCode);
}
rozumiesz, że enumMap mapuje enum-> Object not vice verse? – bestsss
Czy profilowanie kodu pokazuje, że wyszukiwanie liniowe jest niewystarczające? – trashgod
@bestsss, może moja mapa jest źle nazwana. To nie jest EnumMap, tylko mapa z String-> PresentationChannel (tj. Value-> instance) – Ray