Olá senhores,
O que deveria ocorrer quando inserimos um objeto "igual" à outro dentro de um HashSet? Uma exceção seria lançada? Pergunto isto porque mesmo após sobrescrever o método hashCode na classe Conta e inserindo duas contas de mesmo número em um HashSet, a adição está ocorrendo normalmente. Poderiam verificar se a implementação abaixo está correta?
Outra coisa que percebi ao realizar o debug no código é que o método sobrescrito equals da classe Conta é chamado a partir da segunda chamada do método add() do objeto HashSet e mesmo retornando true a operação é concluída com sucesso.
O que não estou percebendo aqui?
public abstract class Conta {
Cliente titular;
private int numero;
protected double saldo;
private double limite;
private static int contaIncremental = 1;
private String nome;
public Conta() {
this.setNumero(contaIncremental);
contaIncremental++;
}
public Conta(int numero, double limite) {
this(numero, limite, 0);
}
public Conta(int numero, double limite, double saldoInicial) {
this.setNumero(numero);
this.limite = limite;
this.saldo = saldoInicial;
}
public void saca(double valor) {
if (valor > this.saldo + this.limite) {
System.out.println("Saque invalido");
} else {
this.saldo = this.saldo - valor;
}
}
public void deposita(double valor) {
if (valor <= 0) {
throw new IllegalArgumentException("Valor depositado não pode ser negativo ou igual a zero");
}
this.saldo = this.saldo + valor;
}
public double getSaldo() {
return this.saldo;
}
public void atualiza(double taxa) {
this.saldo += saldo * taxa;
}
public boolean equals(Object obj) {
if (!(obj instanceof Conta)) {
return false;
}
Conta outraConta = (Conta) obj;
return this.getNumero() == outraConta.getNumero();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + numero;
return result;
}
public int getNumero() {
return numero;
}
public void setNumero(int numero) {
this.numero = numero;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}
public class ContaPoupanca extends Conta implements Comparable<Conta> {
public void atualiza(double taxa) {
this.saldo += this.saldo * taxa * 3;
}
@Override
public int compareTo(Conta o) {
if (this.getNumero() > o.getNumero())
return 1;
else if (this.getNumero() < o.getNumero())
return -1;
return 0;
}
}
public class TestaCollections {
public static void main(String[] args) {
Conta nc = new ContaPoupanca();
nc.setNumero(1234);
nc.setNome("Bruno Miranda");
nc.deposita(100);
Conta np = new ContaPoupanca();
np.setNumero(1234);
np.setNome("Tamires Lima");
np.deposita(100);
Set<Conta> sc = new HashSet<>();
sc.add(nc);
sc.add(np);
}
}