O método equals() é usado em classes em que é possível haver dois objetos
distintos (ou seja, duas instâncias em locais diferentes da memória) mas que
devem ser considerados iguais para fins da aplicação,
Caso típico são as strings. Se eu tenho duas strings criadas assim:
String nomeUniversidade = new String("UFRJ");
String minhaUniversidade = new String("UFRJ");
haverá dois objetos distintos, em endereços diferentes.
Mas para todos os efeitos, gostaríamos de considerar as duas strings como
iguais, por exemplo, se quisermos saber se minhaUniversidade é igual a
nomeUniversidade, a resposta deveria ser true.
Mas se usarmos o comparador ==, a resposta será false, pois são objetos
diferentes:
minhaUniversidade == nomeUniversidade dá false.
Aí entra o método equals, onde minhaUniversidade.equals(nomeUniversidade)
retorna true!
No caso específico dos enums, isso nunca ocorre, porque cada instância é
única, por isso não há necessidade de haver método equals com enums.
Jonathan
2010/4/26 Peter P. Lupo <[email protected]>
> 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]<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.