Converter String para Enum

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.

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…

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

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.

[quote=ricardocomp][code]
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));
            
        }


}
[/code][/quote]
Tem certeza que isso é Java? :shock:

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.

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

[]'s.

[quote=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.[/quote]

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.)

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…

[code]
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));  
              
        }  


} [/code]

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

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

[]'s.[/quote]
Por causa disso aqui:
Enum.Parse
typeof(TipoUsuario)

É coisa do .NET …

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

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.

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).

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.

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 .

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:

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

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

[]'s a Todos. :smiley:

[quote=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[/quote]

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 .

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;  
        }

   }