Boa tarde pessoal,
Peço desculpas caso não for o formato ideal para tirar essa dúvida, este é o meu primeiro post aqui.
Pois bem, estou estudando o capítulo de Collections Framework da apostila da Caelum, e no exercício 8 tem o seguinte enunciado:
8. (opcional, avançado) Crie uma classe de teste e verifique se sua classe Conta funciona agora corretamente em um HashSet, isto é, que ela não guarda contas com número e agência repetidos. Depois, remova o método hashCode. Continua funcionando?
Dúvida: Mesmo com os métodos hashcode e equals gerados pela IDE (atributos agencia e número), meu HashSet guarda objetos em duplicidade. O engraçado é que quando comparo c1 com c2 em um método equals, ele me retorna true. Mas os hashcodes são diferentes (??)
Tive um pouco de dificuldade de encontrar meu erro. Conseguem me dar uma mão nesta?
Abraços
1 - Classe Conta
Package br.com.caelum.contas.modelo;
import java.util.Collections;
import java.util.List;
import java.util.Set;
public abstract class Conta implements Comparable {
protected double saldo;
private String titular;
private String agencia;
private int numero;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((agencia == null) ? 0 : agencia.hashCode());
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 (agencia == null) {
if (other.agencia != null)
return false;
} else if (!agencia.equals(other.agencia))
return false;
return true;
}
public String toString(){
return "[titular= " + titular.toUpperCase() + ", numero= " + numero + ", agencia= " + agencia + "]";
}
public void deposita(double valor){
if(valor < 0){
throw new IllegalArgumentException("Você tentou depositar um valor negativo");
}
else{
this.saldo += valor;
}
}
public void saca(double valor){
if(valor > this.saldo){
throw new IllegalArgumentException("Você tentou sacar um valor negativo");
}
else{
this.saldo -= valor;
}
}
public void transfere (double valor, Conta conta){
this.saca(valor);
conta.deposita(valor);
}
//getters and setters
public int compareTo(Conta outraConta){
if(this.saldo < outraConta.saldo){
//objeto comparador é menor?
return -1;
}
if(this.saldo > outraConta.saldo){
//objeto comparador é maior?
return 1;
}
//objeto comprador é igual?
return 0;
}
}
2 - Classe Banco
package br.com.caelum.contas.modelo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Banco {
private String nome;
private int numero;
Set <Conta> contas = new HashSet <>();
Map<String, Conta> mapaDeContas = new HashMap <>();
public void adiciona (Conta c){
if(this.contas.add(c) == true){
this.contas.add(c);
}
else{
this.contas.remove(c);
}
mapaDeContas.put(c.getTitular(), c);
}
//public Conta pegaConta (int x){
//return this.contas.get(x);
//}
public int pegaQuantidadeDeContas(){
return this.contas.size();
}
public Conta buscaPorTitular(String nomeDoTitular){
return mapaDeContas.get(nomeDoTitular);
}
public Banco ( String nome, int numero){
this.nome = nome;
this.numero = numero;
}
public String getNome(){
return this.nome;
}
public int getNumero(){
return this.numero;
}
}
3 - Classe TestaBanco2
package br.com.caelum.contas.main;
import br.com.caelum.contas.modelo.Banco;
import br.com.caelum.contas.modelo.Conta;
import br.com.caelum.contas.modelo.ContaCorrente;
public class TestaBanco2 {
public static void main (String [ ] args){
Banco banco2 = new Banco ("CaelumBank", 999);
Conta c1 = new ContaCorrente ();
c1.setAgencia("2");
c1.setNumero(111);
//contas.add(c1);
Conta c2 = new ContaCorrente ();
c2.setAgencia("2");
c2.setNumero(111);
//contas.add(c2);
Conta c3 = new ContaCorrente ();
c3.setAgencia("3000");
c3.setNumero(321);
//contas.add(c3);
banco2.adiciona(c1);
banco2.adiciona(c2);
banco2.adiciona(c3);
System.out.println(banco2.pegaQuantidadeDeContas());
//System.out.println(banco2.buscaPorTitular("Gabriel"));
System.out.println(c1.equals(c2));
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
//mesmo com hashcode e equals, o hashset insere objetos duplicados
}
}
4 - Retorno do programa:
3
true
366712642
1829164700