Como obter o ídice de uma variável dentro de um ENUM?

8 respostas
andre_teprom

pessoal,

Gostaria de saber como posso obter - por exemplo - o índice apontado por "sINFO" dentro de :

static public enum MensagensLog { sFATAL , sERROR , sWARNING , sINFO , sDEBUG , sDISABLED } ;

Sei que é 3.
Quando eu uso :

System.out.println(MensagensLog.values()[3]); // Saída => sINFO

Eu sonsigo o inverso, ou seja, em função do índice, obter o valor.
Mas na verdade, eu queria o inverso :

métodoxyz( sINFO ) = 3 ;

Alguem pode ajudar, pfv ?

+++

8 Respostas

otaviojava

Tenta assim:

MensagensLog t=MensagensLog.sFATAL;
        int indice =t.ordinal();
otaviojava

Você não precisa adicionar o enum em uma variável e vc pode passar ele para String também.

int indice  =     MensagensLog.sERROR.ordinal();
 String indiceString=MensagensLog.sERROR.toString();
andre_teprom

Valeu Otávio !

Mas como eu poderia fazer isso, passando a string como argumento ?
Do modo acima, a String sERROR pr exemplo, está inserida na instrução, textualmente.
Mas eu queria algo tipo :

INDICE = FUNCAO_INDICE( sERRO ) ;

Tem como fazer assim ?

+++

A

Para transformar String em enum, você pode utilizar o método estático valueOf da enum.

Evitar usar o método ordinal() para associar cada enum a um indíce.
Se a ordem da enum é alterada, seu programa pode parar de funcionar.

Dê uma olhada no livro Effective Java 2nd Edition e veja formas melhores de fazer isso.

otaviojava

Tenta assim:

int indica= MensagensLog.valueOf("sFATAL").ordinal();
wbdsjunior

acho que uma solução melhor seria adicionar alguns atributos ao Enum.

[url]http://download.oracle.com/javase/tutorial/java/javaOO/enum.html[/url]

public class Menssagem {
    static enum MensagemEnum {
        WARNING(1, "Warnig!")
      , ERROR(2, "Error!");

        private int codigo;
        private String mensagem;

        private MensagemEnum(int codigo, String mensagem) {
            this.codigo = codigo;
            this.mensagem = mensagem;
        }

        static MensagemEnum find(int codigo) {
            for (MensagemEnum me : MensagemEnum.values()) {
                if (me.codigo == codigo) {
                    return me;
                }
            }
            throw new IllegalArgumentException("Mensagem de código " + codigo + " não encontrada");
        }

        public int getCodigo() {
            return codigo;
        }

        public String getMensagem() {
            return mensagem;
        }
    }

    public static void main(String[] args) {
        System.out.println(MensagemEnum.WARNING.getMensagem());
        System.out.println(MensagemEnum.WARNING.getCodigo());
        System.out.println(MensagemEnum.find(2).getMensagem());
    }
}
seja criativo e adapte o exemplo.
andre_teprom

pessoal,

Por estar apanhando um bocado, mudei a estrutura do programa e parti pra solução mais simples, convertendo o tipo enum em String[].
Agora uso apenas o método lengh e um while e fica tudo resolvido.

Obrigado pelas dicas.

+++

heroijapa

A Pattern de enum em string tem alguns erros, como a possibilidade de se adicionar acidentalmente 2 valores iguais ao array, fora isso não vejo grilo.

Criado 15 de janeiro de 2011
Ultima resposta 15 de jan. de 2011
Respostas 8
Participantes 5