Como determino os atributos para esses métodos?
Sempre tenho que especificar todos os atributos da minha classe?
Alguém pode me dar uma explicação ou dar o link de um material legal?
Por exemplo, criei no Eclipse para a classe abaixo e por default ele seleciona todos os atributos. Isso é uma boa prática?
Muito obrigado,
Marques
@Entity
@Table(name = "produto", catalog = "loja_virtual")
public class Produto implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String foto;
public Produto() {
}
public Produto(String foto) {
this.foto = foto;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "foto", nullable = false)
@NotNull
public String getFoto() {
return this.foto;
}
public void setFoto(String foto) {
this.foto = foto;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((foto == null) ? 0 : foto.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Produto other = (Produto) obj;
if (foto == null) {
if (other.foto != null)
return false;
} else if (!foto.equals(other.foto))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
Quem define os atributos para comparar no equals é você (ou as regras de negócio rs)
tipo assim, o que define que dois produtos são iguais? se eles tiverem o mesmo id já serve? ou eles também tem que ter o mesmo peso/altura? e o nome, pode ser diferente?
Vai mais ou menos por aí… tipo, uma classe Pessoa (exemplo clássico)
para saber se duas pessoas são iguais, o que você compararia? o nome? nome dos pais? idade? cpf (acho que este e melhor rs)? gênero?
A primeira coisa que você tem que ter em mente que igualdade e identidade de Entidades não são a mesma coisa.
Exemplo: Uma uma classe Funcionario pode ter como atributos o nome o setor e a atribuição de uma pessoa. No setor de desenvolvimento podemos ter dois programadores chamados Alexandre. Todos os atributos deles são iguais mas eles são funcionários diferentes, pois possuem IDENTIDADES diferentes. A identidade de uma entidade nunca muda, mas qualquer um de seus atributos podem mudar. Se um dos Alexandre fosse para outro setor ou mudase de setor, sua identidade continuaria sendo a mesma.
Então para saber se duas referencias a entidades são representam a mesma entidade é necessario comparar suas Identidades mesmo que os atributos sejam diferentes!
Já a igualde depende do que você necessita para saber se uma entidade (ou uma classe) é igual a outra. Ela, no geral, não deve levar em consideração a identidade! Duas Entidades podem ser iguais, mais represetarem objetos diferentes.
Exemplo: Em um sistema de entregas e eu posso ter o endereço da pessoa e o endereço da entrega. O endereço da pessoa pode ser igual ao da entrega, mas não deve ser o “mesmo endereço”, pois se um mudar acarretaria em mudanças no outro. Então os dois poderiam ter todos os seus atributos iguais com exceção das suas identidades.
Ou seja, use para equals e hashcode apenas os atributos que indicam se duas classes são “iguais”, mas não utilize sua identidade.
Já o conceito de igual depende dos atributos que caracterizem a igualdade entre dois objetos, as vezes nem todos os atributos são necessários. No caso da nossa Classe Funcionario por exemplo, eu poderia considerar que dois funcionarios são iguais quando desepenham as mesmas atividades, nesse caso os outros atributos não seriam necessarios para métodos equals e hashCode