[RESOLVIDO] Dúvida Questão Test Killer

6 respostas
rmala_ti

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

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;

Resposta: B

Não consegui entender.

Grato.

6 Respostas

pmlm

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.

rmala_ti

Hum…

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

Tchello

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

rmala_ti

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.

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!

rmala_ti

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!

Perfeito…

Estava me esquecendo deste detalhe…

Agora eu entendi, valeu mesmo pessoal.

Criado 22 de fevereiro de 2010
Ultima resposta 22 de fev. de 2010
Respostas 6
Participantes 4