Você pode usar um mapa estático em sua enumeração que mapeia Strings para constantes de enumeração. Use-o em um método estático 'getEnum'. Isso ignora a necessidade de iterar pelas enumerações sempre que você deseja obter uma do valor String.
public enum RandomEnum {
StartHere("Start Here"),
StopHere("Stop Here");
private final String strVal;
private RandomEnum(String strVal) {
this.strVal = strVal;
}
public static RandomEnum getEnum(String strVal) {
if(!strValMap.containsKey(strVal)) {
throw new IllegalArgumentException("Unknown String Value: " + strVal);
}
return strValMap.get(strVal);
}
private static final Map<String, RandomEnum> strValMap;
static {
final Map<String, RandomEnum> tmpMap = Maps.newHashMap();
for(final RandomEnum en : RandomEnum.values()) {
tmpMap.put(en.strVal, en);
}
strValMap = ImmutableMap.copyOf(tmpMap);
}
@Override
public String toString() {
return strVal;
}
}
Apenas verifique se a inicialização estática do mapa ocorre abaixo da declaração das constantes enum.
BTW - esse tipo 'ImmutableMap' é da API do Google goiaba, e eu definitivamente recomendo em casos como este.
EDIT - Pelos comentários:
- Esta solução pressupõe que cada valor de sequência atribuído seja exclusivo e não nulo. Dado que o criador do enum pode controlar isso, e que a string corresponde ao valor de enum exclusivo e não nulo, isso parece uma restrição segura.
- Adicionei o método 'toSTring ()' conforme solicitado na pergunta