Dúvida com equals

8 respostas
E

Bom dia
Estou com dúvida quanto a um exemplo da apostila da Caelum

public boolean equals(Object object) { Conta outraConta = (Conta) object; if (this.saldo == outraConta.saldo) { return true; } return false; }

Pra que serve a linha Conta outraConta = (Conta) object ?
Pra mim não faz muito sentido … quando eu vou comparar eu irei passar como parametro uma referencia a um objeto Conta.
Eu lembro que o professor disse algo do tipo “Mas o compilador não sabe se aquele object é uma Conta ou não”.
Ok. Mas porque eutenho que criar uma nova refêrencia, ao invez de usar um castling ?
Att

8 Respostas

d34d_d3v1l

Vc está faznedo o CASTING nessa linha.

Esta ‘transfoormando’ um objeto do tipo Object,
em um objeto do tipo Conta.

daveiga

Se não quiser atualizar a referência pode fazer um casting diretamente:

public boolean equals(Object object) { if (this.saldo == ((Conta) objec).saldo) { return true; return false; }

PS: Lembre-se de verificar se Object não é nulo :stuck_out_tongue:

E

Calma cara eu sei que é Casting foi erro de digitação mesmo =/
Minha duvida era exatamente essa Daveiga, acho mais “racional” assim pois vc nao cria outra referencia, só faz um Casting direto (claro que teria que ter um try catch pq ali pode dar uma exception).
Obrigado aos dois !

DaniloAndrade

bom dia edubranquinho,

cara nada te impede de fazer isso:

public boolean equals(Object object) {  
    if (this.saldo == ((Conta) object).saldo) {  
        return true;  
    }  
    return false;  
}

agora o que é mais legivel pra quem ta aprendendo

fazer isso:

Conta outraConta = (Conta) object;  
if (this.saldo == outraConta.saldo)

ou isso:

if (this.saldo == ((Conta) object).saldo)
DaniloAndrade

outra coisa, criar variaveis dentro do escopo de um metodo não traz custo de memoria a aplicação.

daveiga

Complementando o que o DaniloAndrade falou, criar novas referências cria apenas “ponteiros” não objetos em si, assim tudo o que você está fazendo é trazê-lo para um escopo local.

Em alguns casos é até preferível que você faça isso e acesse no mesmo escopo, diretamente algum valor do que ficar acessando-o através de getters e mais getters, por exemplo:

É melhor fazer isso:

UF uf = pessoa.getEnderecoPrincipal().getCidade().getUF(); for(...) // usando várias vezes uf aqui.

Do que repetir vária svezes os getters, por uma questão de performance mesmo, sem falar em legibilidade.

E

É verdade… vocês tem razão !

muito obrigado

guilherme.dio

O certo seria verificar a instancia antes né:

@Override
public boolean equals(Object obj) 
{
	if(obj instanceof Conta)
       {
           Conta conta = (Conta)obj;
           //Verificações de igualdade retornando true ou false...
       }
       return false;
}
Criado 27 de junho de 2012
Ultima resposta 28 de jun. de 2012
Respostas 8
Participantes 5