[RESOLVIDO] Dúvida Questão Test Killer

Bom dia!
Não entendi a resposta, alguém pode ajudar?

[code]public class Person{
private String name, comment;
private int age;
public Person(String n, int a, String c){
name = n; age = a; comment =c;
}
public boolean equals(object o){
if(!(o instanceof Person)) return false;
Person p = (Person) o;
return age == p.age && name.equals(p.name);
}
}

What is the appropriate definition of the hashCode method in class Person?
A. return super.hashCode();
B. return name.hashCode() + age * 7;
C. return name.hashCode() + comment.hashCode() / 2;
D. return name.hashCode() + comment.hashCode() / 2 - age * 3;
[/code]

Resposta: B

Não consegui entender.

Grato.

Elementos iguais (equals devolve true) devem ter hashCodes iguais.

Como o equals que foi implementado compara os campos age e name, o hashCode deve resultar também desses dois campos para que se verifique a afirmação anterior.

Hum…

Mas o que ocorreria se o hashCode fosse implementado como na letra c?

O que ele quis dizer é que como no equals foi considerado apenas age e name, o hashCode também deve seguir essa lógica, uma vez que pela lógica podemos supor que age e name são campos obrigatórios e sempre existirão para um objeto do tipo Person, já comment não, devendo ser desconsiderado tanto no equals quanto no hashCode, uma vez que pode não existir nessas instâncias (objetos).

Acho que a palavra appropriate define a resposta.

Acredito que todos sejam válidos mas apropriado é a letra b pois equals e hashCode atuam sobre as mesmas variáveis de instância.

Isso eu entendi, mas qual o efeito para a localização de um objeto que tem o hashCode utlizando as variáveis de instância diferentes de equals?

Este objeto será localizado?

Grato.

O hashcode está diretamente ligado ao equals, então o método equals considera iguais os objetos que tem age e name iguais, desconsiderando comments. Então o hashcode também na pode “depender” do atributo comments. senão objetos que podem ter age e name iguais mas comments diferente não teriam hashcode iguais, mas o equals retornaria true e isso é contra a regra do hashcode que diz: “Se o método equals retorna true, o método hashCode deve ter o mesmo valor para os dois objetos e o contrário não é necessário.”

equals == true => hashCode DEVE ter o mesmo número
hashCode iguais, não necessáriamente equals é true.

hashCode diferentes, equals nunca retornará true.

O appropriate é porque a letra “a” também atende a regra, mas é mais apropriado vc restringir mais o hashCode, de “preferencia” utilizando todas as variáveis utilizadas no equals.

Espero ter ajudado.

Abraço!

[quote=Gustavo.foa]O hashcode está diretamente ligado ao equals, então o método equals considera iguais os objetos que tem age e name iguais, desconsiderando comments. Então o hashcode também na pode “depender” do atributo comments. senão objetos que podem ter age e name iguais mas comments diferente não teriam hashcode iguais, mas o equals retornaria true e isso é contra a regra do hashcode que diz: “Se o método equals retorna true, o método hashCode deve ter o mesmo valor para os dois objetos e o contrário não é necessário.”

equals == true => hashCode DEVE ter o mesmo número
hashCode iguais, não necessáriamente equals é true.

hashCode diferentes, equals nunca retornará true.

O appropriate é porque a letra “a” também atende a regra, mas é mais apropriado vc restringir mais o hashCode, de “preferencia” utilizando todas as variáveis utilizadas no equals.

Espero ter ajudado.

Abraço![/quote]

Perfeito…

Estava me esquecendo deste detalhe…

Agora eu entendi, valeu mesmo pessoal.