Eu vou partir da sua conclusão para explicar o que está havendo: "Enfim, me alonguei muito mais do que pretendia, mas fica o aviso ai pra quem for usar o ".equals"... tem que usar "toString" se não não funciona !!!"
E vou fazer um acréscimo para ficar correto: pra quem for usar o ".equals"... tem que usar "toString" se não não funciona *ao comparar com outra String* !!! Sim, pois BOY é uma instância da classe Cargo e nome é uma instância da classe String. A comparação de Cargo com String tem que dar false assim como cadeira.equals(mesa) tem que dar false! ;-) Isso não significa que sempre que vc for usar o equals você tem que usar o toString junto. Na verdade o ideal é não fazer isto e deixar que uma instância saiba se comparar (através de informações como sua classe, subclasse e valores de seus atributos) a instâncias de outras classes. Imagina se vc muda o toString de Cadeira para retornar a String "Sou uma mobília" e faz o mesmo com Mesa. Se você fizer cadeira.equals(mesa) retornaria true quando deveria retornar false. Então o ideal é não usar o toString na comparação a menos que o que vc queira saber é realmente se uma determinada instância retorna um valor específico no toString, que é o caso do exercício da lista. Respondendo suas outras observações: (...) Bom, será mesmo que esse Cargo.BOY retorna uma String ?!", testei e vi que era verdade. (...) Ai eu fui por partes, coloquei na classe SimulaFolha isto "System.out.println(Cargo.BOY), e no consolhe aparecia certinho a palavra "BOY". (...) Isto não significa que Cargo.BOY retorna String. De fato, NÃO retorna! Cargo.BOY é uma referência para uma instância do tipo Cargo. O que acontece é que existe um método println que recebe objetos e chama o .toString() internamente ao imprimir na console. O resultado da chamada que vc fez é o equivalente a System.out.println(Cargo.BOY.toString()); Este é um comportamento bastante comum na API. Ao se precisar representar um objeto de uma forma inteligível, o toString é comumente chamado. O mesmo acontece se você tentar concatenar um objeto com uma string: "Este objeto é um " + Cargo.BOY; O toString de BOY é chamado "automagicamente" pelo compilador, sendo esta chamada equivalente a "Este objeto é um " + Cargo.BOY.toString(); E realmente este parece ter sido o método em que o pessoal teve mais dificuldade mas até agora não vi ninguém com ESTA dificuldade. :-P Abraço Peter P. Lupo http://craftnicely.blogspot.com - http://sites.google.com/site/pplupo MPS.BR Authorized Implementation Practitioner - Certified ScrumMaster Sun Certified Java Associate - Java Brown Belt +55 (021) 81742487 2010/4/26 Thiago Carvalho <[email protected]> > Pelo visto o método "public static Cargo obtem(String nome" é de longa a > parte mais difícil da lista. Eu gostaria apenas de fazer um comentário sobre > como o ".equals" pode ser altamente traiçoeiro. Como o professor pediu, eu > não vou colocar meu código aqui exatamente pelos motivos que ele mencionou, > MAS dentro do método obtem, eu criei um vetor dos 4 tipos de cargo e usei o > ".equals" para comparar esses vetores, um a um, com a String nome do > argumento, caso ele não encontrasse nenhum dos 4, ele retornava null. O > compilador não reclamou, mas pra qualquer coisa que eu digitasse na String > nome, inclusive "boy", "motorista" ou os outros 2, ele retornava null. Ai eu > fui por partes, coloquei na classe SimulaFolha isto > "System.out.println(Cargo.BOY), e no consolhe aparecia certinho a palavra > "BOY".Bom, depois de umas 3 horas fazendo mil testes e modificações (fui > filtrando varias partes do codigo pra tentar achar o erro), eu acabei > descobrindo que se você pedir pra ele imprimir Cargo.BOY, ele imprime a > String "BOY" usando o metódo toString (que ja está automaticamente declarado > pelo fato de ser enum, e sempre é igual ao nome do enum), mas quando você > usa "Cargo.BOY.equals(nome)" (nome é a String declarada no inicio do método > obtem) ele compara o OBJETO BOY com a String nome e nunca retorna verdadeiro > ! Eu sinceramente achei isso muito "cilada", porque quando todos os cargos > retornavam null, a primeira coisa que eu pensei foi "Bom, será mesmo que > esse Cargo.BOY retorna uma String ?!", testei e vi que era verdade. Depois > fiquei rodando em várias outras partes do código, tentando mil coisas, pra > no final descobrir que era só colocar "Cargo.BOY.toString().equals(nome)" > que tudo ia funcionar. Na minha cabeça, como o ".equals" é um método da > classe String, quando eu pedisse para comparar Cargo.BOY com alguma coisa, > ele automaticamente ia usar o método toString do objeto BOY e retornar uma > String e não o objeto inteiro. > > Enfim, me alonguei muito mais do que pretendia, mas fica o aviso ai pra > quem for usar o ".equals"... tem que usar "toString" se não não funciona !!! > > -- > You received this message because you are subscribed to the Google Groups > "Comp 2 - Geral" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]<comp2-geral%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/comp2-geral?hl=en. > -- You received this message because you are subscribed to the Google Groups "Comp 2 - Geral" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/comp2-geral?hl=en.
