Object Comparison

8

The code below generates a false , but the objects have the same attribute values, is there any method that compares the objects, but their attributes, not the object itself?

Produto P5 = new Produto(1, 0, 10,1000.0,"Samsung","smartphone");
Produto P6 = new Produto(1, 0, 10,1000.0,"Samsung","smartphone");  
System.out.println(P5.equals(P6));
    
asked by anonymous 08.02.2014 / 19:10

2 answers

4

The result of the object comparison is done using the methods hashCode() and equals() , of class Object . So to make the comparison your way you should overwrite those methods in your Produto class.

Creating a Product class to my liking (since you did not say the attribute names), it would look something like this:

Product

public class Produto {

    int idProduto;
    String nomeProduto;

    //getters and setters

    @Override
    public int hashCode() {
        //deve ser o mesmo resultado para um mesmo objeto, não pode ser aleatório
        return this.idProduto;
    }

    @Override
    public boolean equals(Object obj) {
        //se nao forem objetos da mesma classe sao objetos diferentes
        if(!(obj instanceof Produto)) return false; 

        //se forem o mesmo objeto, retorna true
        if(obj == this) return true;

        // aqui o cast é seguro por causa do teste feito acima
        Produto produto = (Produto) obj; 

        //aqui você compara a seu gosto, o ideal é comparar atributo por atributo
        return this.idProduto == produto.getIdProduto() &&
                this.nomeProduto.equals(produto.getNomeProduto());
    }   

}

The hashCode method is used to streamline the search in Collections , and should always return the same value for the same object, in the case above I preferred to make the method return the idProduto because if the idProduto is different nor then go to equals() , because it will certainly return false.

    
08.02.2014 / 19:20
2

Are not you forgetting to specialize equals to Produto ?

It should be something like:

@Override
public boolean equals(Object other)
{
    if (other == null) 
        return false;

    if (other == this)
        return true;

    if (!(other instanceof Produto))
        return false;

    Produto p = (Produto) other;

    // Aqui você implementa como deve se feita a comparação.
    // Verifica se os nomes dos produtos são iguais, ids e etc.

    if (p.id == this.id) {
        return true;
    } else {
        return false;
    }
}
    
08.02.2014 / 19:20