Bom pra quem esta fazendo teste com o cd do livro, a repsosta do MasterExame esta errada:
Given:
class SortOf {
String nome;
int bal;
String code;
short rate;
public int hashCode() {
return code.length() * bal;
}
public boolean equals(Object o) {
//insert a code here
}
}
Witch of the following will fulfill the equals() and hashCode() contracts for this class ? (Choose all that applay.)
/* A) */ return ((SortOf)o).bal == this.bal;
/* B) */ return ((SortOf)o).code.length() == this.code.length();
/* C) */ return ((SortOf)o).code.length()*((SortOf)o).bal == this.code.length()*this.bal;
/* D) */ return ((SortOf)o).code.length()*((SortOf)o).bal*((SortOf)o).rate == this.code.length()*this.bal *this.rate;
Segundo o MasterExame as respostas corretas seria… c,d … e é claro que o correto é apenas … c …
ele comenta sobre o fato de que, hashCode pode ser menos preciso que equals, mas q não precisa ser difernete sempre que equals for, porem este não é o caso… o fato é que com a letra D, é possivel produzir hashCodes diferentes, onde o equals da igual, o que fere o contrato de equals / hasCcode
um exemplo segue abaixo
[code] public static void main(String … args) {
SortOf um = new SortOf();
SortOf dois = new SortOf();
um.code = "a";
dois.code = "a";
um.bal = 2;
dois.bal = 1;
um.rate = 1;
dois.rate = 2;
System.out.println("um.hashCode() = " + um.hashCode()); // imprime 2
System.out.println("dois.hashCode() = " + dois.hashCode()); //imprime 1
System.out.println("um.equals(dois) " + um.equals(dois)); //mesmo com os hash diferente o equals da igual, ferindo o contrato
System.out.println();
}[/code]