Tengo varias enumeraciones de Java que se parecen más abajo (editadas para la confidencialidad, etc.). En cada caso, tengo un método de búsqueda con el que no estoy satisfecho; en el ejemplo siguiente, es findByChannelCode
.La forma correcta de buscar una enumeración por valor
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;
}
}
El problema es que me siento tonta haciendo estas búsquedas lineales cuando tan sólo pudiera estar usando un HashMap<String, PresentationChannel>
. Así que pensé en la solución a continuación, pero espero que sea un poco más desordenada y, más al grano, no me importó reinventar la rueda cuando seguramente alguien más se ha encontrado con esto. Quería obtener algo de la sabia sabiduría de este grupo: ¿Cuál es la forma correcta de indexar una enumeración por valor?
Mi solución:
ImmutableMap<String, PresentationChannel> enumMap = Maps.uniqueIndex(ImmutableList.copyOf(PresentationChannel.values()), new Function<PresentationChannel, String>() {
public String apply(PresentationChannel input) {
return input.getChannelCode();
}});
y, en la enumeración:
public static PresentationChannel findByChannelCode(String channelCode) {
return enumMap.get(channelCode);
}
usted entiende que los mapas enumMap enum-> Objeto no viceversa? – bestsss
¿El perfil del código muestra que la búsqueda lineal es inadecuada? – trashgod
@bestsss, tal vez mi mapa tiene un nombre pobre. No es un EnumMap, solo un mapa de String-> PresentationChannel (es decir, valor-> instancia) – Ray