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]
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.
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).
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.
[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.