No vídeo, o Eclipse gera o seguinte código:
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(saldo);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
Eu não entendi exatamente o que esse código faz, linha por linha, nem parece ser esse o foco, já que o professor também não explica, só gera e usa, mas o problema maior é que, usando o IntelliJ, ele gera apenas esse código:
@Override
public int hashCode() {
return Objects.hash(saldo);
}
A intenção é fazer com que contas com o mesmo saldo sejam consideradas como duplicadas e uma delas será "ignorada". Com o código gerado pelo IntelliJ isso não acontece.
Depois, mesmo copiando o código que o Eclipse gera no IntelliJ, não funciona, a saída continua sendo 2 para o tamanho da lista Contas:
package com.company.br.com.caelum.fj11.programa;
import com.company.br.com.caelum.fj11.modelo.Conta;
import com.company.br.com.caelum.fj11.modelo.ContaCorrente;
import java.util.*;
public class TestaColecoes {
public static void main(String[] args) {
Set<String> nomes = new HashSet<String>();
nomes.add("Mauricio");
nomes.add("Guilherme");
nomes.add("Guilherme");
System.out.println(nomes.size());
Set<Conta> contas = new HashSet<Conta>();
Conta c1 = new ContaCorrente();
c1.deposita(500);
Conta c2 = new ContaCorrente();
c2.deposita(500);
contas.add(c1);
contas.add(c1);
contas.add(c2);
System.out.println(contas.size());
}
}
Saída:
/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=56137:/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/brunasantos/IdeaProjects/BancoAntigo/out/production/BancoAntigo com.company.br.com.caelum.fj11.programa.TestaColecoes
2
2
Process finished with exit code 0
- Tem como gerar a hashCode com esse código todo que o Eclipse gera no IntelliJ?
- Por que minha saída continua sendo "2", mesmo usando o código que o Eclipse gera?
Atualização da dúvida: Vi também que o Eclipse gera o método equals, coisa que o IntelliJ também não fez.
Quando eu inseri o código do equals
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
Conta outraConta = (Conta) obj;
if(Double.doubleToLongBits(saldo) != Double.doubleToLongBits(outraConta.saldo));
return false;
}
Apresenta um erro de que o equals já foi definido, como resolvo isso? Meu código completo segue no comentário, não cabe aqui.
Obrigada!