Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

hashCode ignorando subclasses diferentes

Percebi que esse método do hashcode leva em consideração a diferença entre subclasses. Gostaria de saber se existe a possibilidade de um dia eu ter que usá-la em diferentes subclasses, como uma lista onde há contaCorrente e ContaPoupanca,. percebi que posso fazer assim:

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        //excluindo a seguinte sentença
        /*if (getClass() != obj.getClass())
            return false;*/
        Conta other = (Conta) obj;
        if (numero != other.numero)
            return false;
        return true;
    }

Isso costuma ser utilizado? Existe outra maneira pra isso?

3 respostas
solução!

Oi Jonathan, tudo bom?

Acredito que a ideia seja reutilizar o equals por herança, certo?

Acredito que uma forma de fazer isso, seja verificando se o objeto passado é uma instancia de Conta, assim todos que herdam dela também são instancias devido ao polimorfismo.

Algo como:

@Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (obj instanceof Conta)
            return false;
        Conta other = (Conta) obj;
        if (numero != other.numero)
            return false;
        return true;
    }

Tome muito cuidado ao simplesmente apagar partes do algoritmo pois nesse caso:

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        // não verificamos mais se o objeto é do tipo Conta
        /*if (getClass() != obj.getClass())
            return false;*/
    // o que garante que esse casting vai funcionar?
        Conta other = (Conta) obj;
        if (numero != other.numero)
            return false;
        return true;
    }

Ao realizarmos o casting de obj para Conta, não podemos ter certeza de que realmente será uma conta. Afinal, o if verificando a classe do objeto foi removido.

Qualquer problema é só falar.

Abraço e bons estudos.

Entendo. A anulação foi só pra mostrar minha linha de raciocínio. Nunca pretendi usar de fato isso. No mais, Valeu pelo esclarecimento.

Boa Jonathan!

Qualquer problema é só falar.

Abraço