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.

Responder a