Livro da Kathy Sierra CD do MasterExam Q52 Exame A

0 respostas
Lavieri

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

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();
    }
Criado 27 de maio de 2009
Respostas 0
Participantes 1