Re: Não são iguais?
[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: Não são iguais?



Ricardo Ossamu Moriya writes:
> Pessoal, estou com um problema neste peda?o de c?digo:
> 
> Vector teste = new Vector(1);
> Parametro var1 = new Parametro("qwerty");
> Parametro var2 = new Parametro("qwerty");
> teste.add(var1);
> System.out.println(teste.contains(var2));
> 
> Parametro ? uma classe que eu criei. Eu queria que ele identificasse var2 
> como sendo igual a var1, mas ele imprime "false".
> Notei que se usar a classe String no lugar de Parametro ele imprime "true".
> Se algu?m puder me ajudar nessa v?spera de P?scoa...

isto é por causa do mecanismo de comparação de objetos do Java.
Toda classe é descendente da classe Object. A classe Object declara
um método:

      public boolean equals(Object other) {
         return this == other;
      }

Então, você pode chamar o método equals para objetos de qualquer
classe no Java, e pode reescrevê-lo nas suas classes para fazer
comparações inteligentes. Se você não escrever um método equals()
na sua classe, ficará em vigor a comparação padrão, que é comparar
referências. A comparação de referências só retorna true se os dois
objetos sendo comparados são *o mesmo objeto*. Portanto:

MinhaClasse um = new MinhaClasse();
MinhaClasse dois = new MinhaClasse();
System.out.println(um.equals(dois));

um = dois;
System.out.println(um.equals(dois));

Isto imprimirá false, e depois true. Isto é porque somente no segundo
println as referências um e dois são o mesmo objeto.

Mas como a classe String fica isenta disso? Afinal:

String s1 = "haha";
String s2 = "haha;
System.out.println(s1.equals(s2));

imprime true. Isso é possível porque a classe String reimplementa
o método equals de forma que ele compare o conteúdo, não a referência. 

Classes como Vector utilizam o método equals dos objetos
que contêm implementar funções como contains() e outras. Por isso,
se você quiser que seu exemplo funcione como funciona com
a classe String, você terá que implementar o seu próprio
método equals.

Seu método poderia ser algo como:

public class Parametro {
   ...
   public boolean equals(Object other) {
      return valor.equals( (Parametro)other.getValor() );
   }
   ...
}

Espero ter ajudado,

Bruno T. C. de Oliveira