quinta-feira, 21 de fevereiro de 2013

Importância dos métodos hashCode e equals - JSF

Para que os objetos sejam diferenciados uns de outros, precisamos implementar o métodos equals().
No banco de dados, as chaves primárias diferenciam registros distintos. Quando mapeamos uma entidade de uma tabela, devemos criar o método equals(), levando em consideração a forma em que os registros são diferenciados no banco de dados.



public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Pessoa other = (Pessoa) obj;
        if (codigo == null) {
            if (other.codigo != null)
                return false;
        } else if (!codigo.equals(other.codigo))
            return false;
        return true;
    }


Veja que nesse exemplo, esse método é baseado no atributo "codigo", que representa a chave na tabela do banco de dados.

O método hashCode() ajuda a criar um critério para espalhar os diversos objetos dentro de uma tabela de espalhamento. Isso é importante para um determinado objeto ser encontrado mais rapidamente, melhorando a performance do software, pois evita muitas comparações desnecessárias durante uma busca em memória.

Um comentário:

  1. prime e result são constantes então querendo iniciar uma refleção sobre o assunto lhes pergunto qual é a diferença entre super.hashCode() e o hashCode() que implementa este algoritmo apresentado acima?. Por que os valores retornado de super.hashCode() são um alias para a referencia do objeto podendo causar assim um conflito entre estes valores pois a jvm se encarrega de não gerar valoes duplicados para super.hashCode() mais como vc esta apenas somanda 31 ao valor retornado pelo super.hashCode() então implementar este metodo com este algoritmo parece não influenciar em nada a comparação entre os objetos, já que o super.hashCode() é utilizado em ordem precedente ao equals pelos maps e hashMaps para localizar uma instancia de objeto.

    ResponderExcluir