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:
publicenumTipoUsuario{PRODUTOR,TECNICO;}
E na minha classe Dao eu preciso fazer
o seguinte:
publicclassUsuarioSistemaDao{...while(rs.next()){intid=rs.getInt(1);Stringlogin=rs.getString(2);Stringpassword=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.UsuarioSistemaDaoTipoUsuariotipoUsuario=Enum.Parse(typeof(TipoUsuario),tpUsuario,true);list.add(newUsuarioSistema(id,login,password,tipoUsuario));}...}
Será que alguém poderia me dar uma ajdua,
fazendo o favor?
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
entanglement
enumTipoCliente{BONZINHO,RECLAMAO,SEMNOCAO,CALOTEIRO,APRESSADINHO};classTesteStringToEnum{publicstaticvoidmain(String[]args){String[]testes={"BONZINHO","RECLAMAO","SEMNOCAO","CALOTEIRO","BURRO"};for(Stringt:testes){try{TipoClientetc=TipoCliente.valueOf(t);System.out.println(tc);}catch(java.lang.IllegalArgumentExceptionex){System.out.println("Nao foi encontrado o tipo de cliente : "+t);}}}}
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:
publicclassUsuarioSistemaDao{...while(rs.next()){intid=rs.getInt(1);Stringlogin=rs.getString(2);Stringpassword=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.UsuarioSistemaDaoTipoUsuariotipoUsuario=Enum.Parse(typeof(TipoUsuario),tpUsuario,true);list.add(newUsuarioSistema(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.
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...
publicclassUsuarioSistemaDao{...while(rs.next()){intid=rs.getInt(1);Stringlogin=rs.getString(2);Stringpassword=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 TipoUsuariotipoUsuario=null;if(TipoUsuario.PRODUTOR.getValorEnum.equals(tpUsuario)){tipoUsuario=TipoUsuario.PRODUTOR;}else{tipoUsuario=TipoUsuario.TECNICO;}list.add(newUsuarioSistema(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?
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
entanglement
Ud. estaba hablando en portugués, pero pensó estar a hablar en español
ricardocomp
Jóia entanglement ?
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?
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:
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í.
[]'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:
A minha última dúvida entanglement
é preciso fazer o tratamento para:
java.lang.IllegalArgumentException ex
no meu caso?
[]'s.
E
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:
Obrigado pessoal
pela ajuda de todos vc’s,
eu vou fazer os meus
teste aqui agora.
[]'s a Todos.
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:
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:
publicenumTipoUsuario{PRODUTOR("Produtor"),TECNICO("tecnico");privateStringvalorEnum;publicTipoUsuario(Stringvalor){this.valorEnum=valor;}publicStringgetValorEnum(){returnvalorEnum;}publicstaticTipoUsuarioparsear(Stringtipo){TipoUsuariotipoUsuario=null;if("Produtor".equals(tipo)){tipoUsuario=TipoUsuario.PRODUTOR;}elseif("Tecnico".equals(tipo)){tipoUsuario=TipoUsuario.TECNICO;}else{thrownewTipoUsuarioException("erro ao parsear o tipo: "+tipo);}returntipoUsuario;}}
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
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.