Boa noite pessoal.
Reescrevi os métodos HashCode e e equals na minha classe Conta para verificar se o número da conta é igual.
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + numero;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Conta other = (Conta) obj;
if (numero != other.numero)
return false;
return true;
}
Se no meu main eu crio um HashSet e tento adicionar neles duas contas com números igual não é possível, vou adicionar apenas um. ContaCorrente (número,agência).
HashSet<Conta> contas = new HashSet<Conta>();
ContaCorrente c1 = new ContaCorrente(123, 1233);
ContaCorrente c2 = new ContaCorrente(123, 123);
Até aqui entendi, se printar "contas.size()" será retornado 1.
Abaixo, no próprio main, eu seto saldo nas duas contas.
c1.setSaldo(1111);
c2.setSaldo(22222);
System.out.println(c1);
System.out.println(c1.getSaldo());
System.out.println(c2);
System.out.println(c2.getSaldo());
A saída é:
br.com.alura.banco.conta.ContaCorrente@9a
1111.0
br.com.alura.banco.conta.ContaCorrente@9a
22222.0
Sem criar HashCode, as referências c1 e c2 apontam cada um para um local diferente, ou seja, uma referência para dois objetos em locais diferentes. Exemplo da saída sem implementar o HashCode em Conta:
br.com.alura.banco.conta.ContaCorrente@70dea4e
1111.0
br.com.alura.banco.conta.ContaCorrente@5c647e05
22222.0
Esqueçam a coleção HashSet que criei para guardar essas contas, porque a parte de guardar nele eu entendi, não vai guardar contas com números iguais. Vamos supor que já até tirei do código.
Minha dúvida é: Quando printo as referências c1 e c2 que possuem o mesmo número da conta (123), elas apontam para um mesmo local, quer dizer que esses dois objetos referentes a c1 e c2 foram guardados em uma mesma "caixinha" na memória por causa do HashCode que criei? Porque consigo setar o saldo e outros atributos do c1 e c2, ou seja, os dois objetos foram criados, mas agora estão se referenciando a um mesmo local.
Obrigado.