[Resolvido] Comparação entre dois objetos

10 respostas
Marques

Colegas,

No for abaixo quero comparar a igualdade entre os objetos ServicoCategoria, porém não retorna igual.
Obseve que se eu comparo pelos ids retorna igual, porém os objetos ele diz que são diferentes.
Onde estou errando?

Muito obrigado, Marques
public void prepareEditare(ServicoPlano plano) {

		String query = "from ServicoCategoria o order by o.categoria, o.descricao";
		Map<String, Object> params = new HashMap<String, Object>();
		servicoCategorias = servicoCategoriaService.findByParam(query, params);

		for (ServicoCategoria servicoCategoria : servicoCategorias) {

			if (servicoCategoria.getId().compareTo(plano.getCategoriaServico().getId()) == 0) {
				System.out.println("Se os ids são iguais, por que na comparação dos objetos na linha abaixo não são iguais?");
				boolean teste = servicoCategoria.equals(servicoPlano.getCategoriaServico());
				System.out.println("Valor de teste: " + teste); // teste retorna false
			}
		}
	}
public abstract class Entity implements Serializable {
	
	public abstract Long getId();
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + Long.signum(getId() ^ (getId() >>> 32));
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Entity other = (Entity) obj;
		if (getId() != other.getId())
			return false;
		return true;
	}

}
@javax.persistence.Entity
@Table(name = "servico_categoria")
public class ServicoCategoria extends Entity {
	private static final long serialVersionUID = 1L;
	
	@Id 
	@GeneratedValue 
	private Long id;
	
	@Column(name = "categoria", nullable = false)
	@Enumerated(EnumType.STRING)
	private ServicoCategoriaEnum categoria;
	
	private String descricao;
	
	public ServicoCategoria() {}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public ServicoCategoriaEnum getCategoria() {
		return categoria;
	}

	public void setCategoria(ServicoCategoriaEnum categoria) {
		this.categoria = categoria;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (!(obj instanceof ServicoCategoria))
			return false;
		ServicoCategoria other = (ServicoCategoria) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}

10 Respostas

darklordkamui

implementa a interface Comparable…

http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

se eu tivesse um exemplo aqui eu postava… sorry mais esse é o caminho ok?

sephil

Olá,

Você pode implementar a interface Comparable, como o amigo acima disse, ou você pode implementar um Comparator para sua necessidade.
Tenho um exemplo no meu blog:
http://fazcertoquefunciona.wordpress.com/2012/05/09/comparando-e-ordenando-objetos-em-uma-collection-java/

Marques

Uma pergunta:
Com o método equals não funciona? Para que serve os métodos equals e hashcode?

Muito obrigado,
Marques

darklordkamui

Marques:
Uma pergunta:
Com o método equals não funciona? Para que serve os métodos equals e hashcode?

Muito obrigado,
Marques

é muito usado com Map, Set e etc… pq vc quer garantir que só ira existir um desse cara armazenado…

ViniGodoy

Equals e comparable são conceitos diferentes. O equals testa se dois objetos são iguais. O comparable dá a noção de ordenação dos objetos.

Dois objetos diferentes podem ter a mesma ordem. E dois objetos iguais podem ter ordens diferentes.

Se você quer fazer um teste com equals, use o método equals, e não com compareTo igualando a 0:

if (servicoCategoria.equals(plano.getCategoriaServico()) == 0) {
Marques

Vini,

Isso não é exatamente o que estou fazendo nessas linhas?

boolean teste = servicoCategoria.equals(servicoPlano.getCategoriaServico()); System.out.println("Valor de teste: " + teste); // teste retorna false

E no entanto a igualdade não se verifica…

ViniGodoy

É sim, desculpe, não havia visto aquele código.

Mas observe que o equals testa se:
a) Os dois objetos são EXATAMENTE da mesma classe (filhos não valem);
b) O objeto comparado não é nulo

Provavelmente uma dessas condições não está batendo. O ideal é colocar no equals um breakpoint e analisar passo-a-passo o que está ocorrendo.

sergiotaborda
Marques:
public abstract class Entity implements Serializable {
	

	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Entity other = (Entity) obj;
		if (getId() != other.getId())
			return false;
		return true;
	}

}

O erro está na linha getId() != other.getId()

teria que ser !getId().equals(other.getId())

Tem que usar o equals entre objetos. Vc está usando !=. Os objetos de ID não têm que ser os mesmos, têm que ser iguais. Vc está comparando se são o mesmo. Por isso dá false.
Quando vc usa o comparaTo no outro codigo dá certo porque vc esá comparando se são iguais e não se são o mesmo.

Marques

sergiotaborda,

Era isso mesmo! Vlw amigão!!!

ViniGodoy

Tem razão. Eu geralmente não uso tipos wrapper para representar o que pode ser representado por tipos primitivos.

Criado 31 de janeiro de 2013
Ultima resposta 31 de jan. de 2013
Respostas 10
Participantes 5