Converter String para Enum

24 respostas
ricardocomp

Olá pessoal,
eu estou querendo converter
uma string em um Enum,
mas não estou conseguindo
será que alguém poderia me
ajudar?

O meu Enum está separado de qualquer
classe:

public enum TipoUsuario {
     PRODUTOR, TECNICO;
}

E na minha classe Dao eu preciso fazer
o seguinte:

public class UsuarioSistemaDao {
...
while (rs.next()) {

                int id = rs.getInt(1);
                String login = rs.getString(2);
                String password = rs.getString(3);
                tpUsuario =  rs.getString(4);
                //Essa linha de baixo está acusando erro não sei porque,
                //Aparece o simbolo vermelho de exclamação dizendo que Cannot Find symbol
                //symbol: variable TipoUsuario
                //location: class dao.UsuarioSistemaDao
                TipoUsuario tipoUsuario = Enum.Parse(typeof(TipoUsuario), tpUsuario, true);
                list.add(new UsuarioSistema(id, login, password, tipoUsuario));
                
            }
...
}

Será que alguém poderia me dar uma ajdua,
fazendo o favor?

[]'s.

24 Respostas

Flavio_Luiz

Kra me desculpa… mas não entendi o pq vc quer fazer isso…
O enum foi criado para maninpular valores de mesma gama mas que são constantes…
Tds os objetos utilizam esse Enum
No que você quer fazer você pederá essa objetivo… pois para cada objeto vc tera um enum…
Isso foi o que eu entendi… se estiver errado me avise…

E
enum TipoCliente {
    BONZINHO, RECLAMAO, SEMNOCAO, CALOTEIRO, APRESSADINHO
};
class TesteStringToEnum {
    public static void main(String[] args) {
        String[] testes = {
            "BONZINHO", "RECLAMAO", "SEMNOCAO", "CALOTEIRO", "BURRO"
        };
        for (String t : testes) {
            try {
                TipoCliente tc = TipoCliente.valueOf (t);
                System.out.println (tc);
            } catch (java.lang.IllegalArgumentException ex) {
                System.out.println ("Nao foi encontrado o tipo de cliente : " + t);
            }
        }
    }
}

Saída:

BONZINHO
RECLAMAO
SEMNOCAO
CALOTEIRO
Nao foi encontrado o tipo de cliente : BURRO
ricardocomp

Jóia Flávio?
Obrigado pela ajuda,
Mas eu tenho uma classe
chamada UsuarioSistema.java
cada instância dessa classe
deve possuir sim um TipoUsuario
para me informar se aquele
usuário cadastrado é um PRODUTOR
ou TECNICO, blz?
Você ou alguém sabe como
que eu faço para converter
essa String pegada do banco
e converte-la para um Enum?

[]'s.

gomesrod
ricardocomp:
public class UsuarioSistemaDao {
...
while (rs.next()) {

                int id = rs.getInt(1);
                String login = rs.getString(2);
                String password = rs.getString(3);
                tpUsuario =  rs.getString(4);
                //Essa linha de baixo está acusando erro não sei porque,
                //Aparece o simbolo vermelho de exclamação dizendo que Cannot Find symbol
                //symbol: variable TipoUsuario
                //location: class dao.UsuarioSistemaDao
                TipoUsuario tipoUsuario = Enum.Parse(typeof(TipoUsuario), tpUsuario, true);
                list.add(new UsuarioSistema(id, login, password, tipoUsuario));
                
            }
...
}
Tem certeza que isso é Java? :shock:
ricardocomp

jóia entanglement?
Eu tentei fazer algo mais ou menos
do jeito que você me falou mas está
com dando errado também.

TipoUsuario tipoUsuario = Enum.valueOf(TipoUsuario, tpUsuario);

[]'s.

ricardocomp

Jóia gomesrod? :smiley:
pq vc me perguntou se
o meu código era Java?
Eu não entendi direito?

[]'s.

E

ricardocomp:
jóia entanglement?
Eu tentei fazer algo mais ou menos
do jeito que você me falou mas está
com dando errado também.

TipoUsuario tipoUsuario = Enum.valueOf(TipoUsuario, tpUsuario);

[]'s.

Use do jeito que eu fiz. É mais rápido e mais simples. Não se esqueça de capturar a IllegalArgumentException e tratá-la adequadamente.

(A propósito, você poderia usar Enum.valueOf(TipoUsuario.class, tpUsuario) mas acho um pouco mais difícil de entender.)

Flavio_Luiz
Ah sim agora entendi... ah kra eu faria assim...
public enum TipoUsuario {  
     PRODUTOR("Produtor"), TECNICO("tecnico");  
    
     private String valorEnum;
     
     public TipoUsuario(String valor){
             this. valorEnum = valor;
     }
      
     public String getValorEnum(){
           return valorEnum;
     }
}
Só que para isso vc precisa criar literalemente um Enum o q é diferente de criar ele em uma classe... ja no seu Dao vc pode fazer assim...
public class UsuarioSistemaDao {  
...  
while (rs.next()) {  
  
                int id = rs.getInt(1);  
                String login = rs.getString(2);  
                String password = rs.getString(3);  
                tpUsuario =  rs.getString(4);  
                //Essa linha de baixo está acusando erro não sei porque,  
                //Aparece o simbolo vermelho de exclamação dizendo que Cannot Find symbol  
                //symbol: variable TipoUsuario  
                //location: class dao.UsuarioSistemaDao  
                TipoUsuario tipoUsuario = null; 
                if(TipoUsuario. PRODUTOR.getValorEnum.equals(tpUsuario )){
                        tipoUsuario = TipoUsuario. PRODUTOR;
                }
                else{
                          tipoUsuario = TipoUsuario. TECNICO;
                }   
                list.add(new UsuarioSistema(id, login, password, tipoUsuario));  
                  
            }  
...  
}

espero ter ajudado... mas eu faria assim a principio... mas ainda axo q a formas mais elegantes de fazer isso...

gomesrod

ricardocomp:
Jóia gomesrod? :smiley:
pq vc me perguntou se
o meu código era Java?
Eu não entendi direito?

[]'s.


Por causa disso aqui:
Enum.Parse
typeof(TipoUsuario)

É coisa do .NET …

E

Ud. estaba hablando en portugués, pero pensó estar a hablar en español :stuck_out_tongue:

ricardocomp

Jóia entanglement ? :smiley:
Eu estou fazendo do jeito
que você me falou mas vc
como que eu faço para fazer o ignoreCase?

E uma dúvida porque precisa colocar o .class no TipoUsuario?

TipoUsuario tipoUsuario = Enum.valueOf(TipoUsuario.class, tpUsuario);

[]'s.

E

a) Não existe “ignoreCase”, conforme você pode verificar na documentação de java.lang.Enum.
A maneira mais simples, no seu caso, é verificar se o enum foi declarado todo em maiúsculas (que é o seu caso) e então passar o valor para maiúsculas. Ou seja:

TipoUsuario tipoUsuario = Enum.valueOf(TipoUsuario.class, tpUsuario.toUpperCase());

b) O primeiro parâmetro de valueOf é do tipo “class<?>”. Então você precisa passar um objeto java.lang.Class (que pode ser obtido usando-se o “.class” que eu pus em negrito).

ricardocomp

Jóia gomesrod?
Eu olhei em um site em inglês aqui
que falava de Enum e por isso eu
estava usando no Java Enum.Parse,
mas obrigado pela ajuda aí. :smiley:

[]'s.

edmarr

Bom nao sei se entendi direito , mas vc poderia usar um enum Com Construtor , mas pq vc usar enum sendo que vc pode usa-lo somente com Constante .

ricardocomp

Jóia entanglement?
Eu acho que agora é só eu fazer
os teste aqui, mas pelo o que você me falou
a minha classe ficou assim:

public List<UsuarioSistema> listarUsuarioSistema() throws LAFQADaoException {
...
while (rs.next()) {

                int id = rs.getInt(1);
                String login = rs.getString(2);
                String password = rs.getString(3);
                String tpUsuario =  rs.getString(4);
                TipoUsuario tipoUsuario = Enum.valueOf(TipoUsuario.class, tpUsuario.toUpperCase());
                list.add(new UsuarioSistema(id, login, password, tipoUsuario));
                
            }
...
}

A minha última dúvida entanglement
é preciso fazer o tratamento para:
java.lang.IllegalArgumentException ex
no meu caso?

[]'s. :smiley:

E

Edmarr, não faz sentido definir um construtor para uma Enum, a menos que ele seja um construtor privado, porque todas as instâncias da enum são criadas no seu carregamento. O que ele queria é fácil de resolver - o método valueOf já faz isso.

Sempre que tiverem alguma dúvida, olhem a documentação:

java.lang.Enum
Enums

ricardocomp

Obrigado pessoal
pela ajuda de todos vc’s,
eu vou fazer os meus
teste aqui agora.

[]'s a Todos. :smiley:

edmarr

entanglement:
Edmarr, não faz sentido definir um construtor para uma Enum, a menos que ele seja um construtor privado, porque todas as instâncias da enum são criadas no seu carregamento. O que ele queria é fácil de resolver - o método valueOf já faz isso.

Sempre que tiverem alguma dúvida, olhem a documentação:

java.lang.Enum
Enums

Fih dependendo do que a pessoa quer faz sentido sim , Lembrando um enum tem modificador de acesso como se fosse uma classe , ou seja por packages e talz , creio que vc deveria ler melhor sobre o assunto para afirmar algo .

Vini_Fernandes

Eu faria o seguinte:

public enum TipoUsuario {    
        PRODUTOR("Produtor"), TECNICO("tecnico");    
         
        private String valorEnum;  
          
        public TipoUsuario(String valor){  
                this. valorEnum = valor;  
        }  
           
        public String getValorEnum(){  
              return valorEnum;  
        }  

       public static TipoUsuario parsear(String tipo){  
              TipoUsuario tipoUsuario = null;
              if("Produtor".equals(tipo)){
                    tipoUsuario = TipoUsuario.PRODUTOR;
              }
              else if("Tecnico".equals(tipo)){
                    tipoUsuario = TipoUsuario.TECNICO;
              }
               else{
                  throw new TipoUsuarioException("erro ao parsear o tipo: "+tipo);
              }
           return tipoUsuario;  
        }

   }
Marky.Vasconcelos

Ou então voce poderia gravar o valor ordinal da Enum no banco.

gomesrod

Sim, é bem mais comum gravar no bd um código numérico para campos tipo desse tipo.

Mas eu não faria pelo valor ordinal não, é meio arriscado zuar tudo na hora de incluir um novo valor no Enum… ao invés disso, colocaria o código como atributo.

Marky.Vasconcelos

Mas se deixar como atributo voce precisa fazer a busca entre todos os enums para ver qual é o certo.
Não sei pra que tirar ifs do codigo para colocar enums sendo que pra encontrar o enum certo voce faz um for com if(algo).

O unico problema de guardar o valor ordinal é colocar novos elementos antes de algum que já existe, se forem colocados cada vez como ultimo nada sera afetado.

gomesrod

Mas como eu sou um grande medroso prefiro não arriscar :wink:
Se houver testes unitários até dá pra garantir que não vai quebrar nada depois da manutenção, mas não é o caso de nenhum projeto em que eu tenha trabalhado.

Mark_Ameba:
Mas se deixar como atributo voce precisa fazer a busca entre todos os enums para ver qual é o certo.
Não sei pra que tirar ifs do codigo para colocar enums sendo que pra encontrar o enum certo voce faz um for com if(algo).

Eu tenho um pequeno “pattern” para não precisar desses for com if espalhados pelo código. É só criar no próprio Enum um método de busca, que depois é chamado assim:

int codigo = blablabla(); tipoUsuario = TipoUsuarioEnum.getByCodigo(codigo);
Além disso, o ordinal tem base 0, o que é meio estranho de armazenar como código (claro que esse “estranho” também depende do gosto de cada um).

Marky.Vasconcelos

Mesmo deixando o pattern no código ainda assim voce não elimina a procura pelo Enum… só passa a responsabilidade para o Enum fazer isso.

Ter como base 0 não é tão ruim. Principalmente por que este numero não serve pra muita coisa por que o que importa é ao carregar o objeto ter o Enum correto no lugar.

Criado 28 de setembro de 2009
Ultima resposta 29 de set. de 2009
Respostas 24
Participantes 7