Re: Não são iguais?
- Subject: Re: Não são iguais?
- From: Bruno Takahashi C de Oliveira <btco@linux.ime.usp.br>
- Date: Sun, 20 Apr 2003 04:17:36 -0300
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