Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] @EqualsAndHashCode(of = "id")

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

1 resposta
solução!

É 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.