Olá Bom dia, como estão? Entendi que é da dependência Lombok, mas ainda não ficou claro. Pergunta a) o que é @EqualsAndHashCode(of = "id") e qual a sua funcionalidade; Pergunta b) Por que é necessário incluir of = "id" ?
Obrigado
Maurício G
Olá Bom dia, como estão? Entendi que é da dependência Lombok, mas ainda não ficou claro. Pergunta a) o que é @EqualsAndHashCode(of = "id") e qual a sua funcionalidade; Pergunta b) Por que é necessário incluir of = "id" ?
Obrigado
Maurício G
É uma ótima pergunta, e é natural ter essa dúvida, pois o Lombok simplifica muito o código, mas esconde a lógica por trás de suas anotações.
Vamos detalhar as suas perguntas sobre @EqualsAndHashCode(of = "id").
Resposta à Pergunta A: O que é @EqualsAndHashCode(of = "id") e qual a sua funcionalidade?
A anotação @EqualsAndHashCode é uma anotação do Lombok que gera automaticamente os métodos equals() e hashCode() para você.
equals(): Este método é usado para comparar dois objetos e determinar se eles são "iguais". Sem essa anotação, o método equals() padrão do Java apenas verifica se as duas variáveis de referência apontam para o mesmo objeto na memória. Com o @EqualsAndHashCode, você pode comparar se dois objetos têm os mesmos valores em seus atributos.
hashCode(): Este método retorna um código numérico (um hash) para o objeto. Ele é crucial para o bom funcionamento de estruturas de dados baseadas em hash, como HashMap, HashSet e HashTable. Quando você adiciona um objeto a um HashSet, por exemplo, ele usa o hashCode() para determinar onde armazenar o objeto.
A funcionalidade combinada de equals() e hashCode() é garantir que objetos com os mesmos valores em seus atributos sejam tratados como o "mesmo objeto" em coleções.
Resposta à Pergunta B: Por que é necessário incluir of = "id"?
A parte (of = "id") é crucial e tem uma funcionalidade muito importante: ela instrui o Lombok a usar apenas o atributo id para gerar os métodos equals() e hashCode().
Se você não especificar (of = "id"), o Lombok usará todos os atributos da classe para gerar os métodos. Em uma classe como a de um Paciente ou Médico, que pode ter nome, CPF, telefone, etc., isso poderia causar problemas.
Cenário do problema sem (of = "id"):
Imagine que você tem um objeto medico e você o altera. Por exemplo, muda o número de telefone dele.
Com @EqualsAndHashCode(of = "id"): O hashCode() não mudaria, pois o id continua o mesmo.
Sem (of = "id"): O hashCode() seria recalculado com base no novo telefone, e o valor mudaria. Isso pode quebrar coleções como um HashSet, que não conseguiria mais encontrar o objeto medico porque o hash dele mudou.
Ao usar (of = "id"), você garante que a identidade do objeto é determinada exclusivamente pelo seu ID. Isso é uma boa prática para entidades de banco de dados, pois o ID é a única característica que realmente define a unicidade de um registro.
Em resumo, a combinação @EqualsAndHashCode(of = "id") garante que:
Dois objetos serão considerados iguais se e somente se tiverem o mesmo id.
O hashCode() de um objeto permanece constante, mesmo que outros atributos (como nome ou telefone) sejam alterados.