Livro da Kathy Sierra CD do MasterExam Q52 Exame A

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]