Metodo equals

5 respostas
thankd

Olá pessoal, to com o seguinte problema. criei uma classe que tem um metodo equals que e pra fazer duas verificações entre duas classes, so que a verificação não esta funcionando, por que sempre ta retornando como se os dois livros fossem iguais, mesmo sem serem. esses são os meus codigos:

Classe:

public class Livro {
    
    private String Titulo;
    private String ISBN;

    public void setISBN(String ISBN) {
        this.ISBN = ISBN;
    }

    public void setTitulo(String Titulo) {
        this.Titulo = Titulo;
    }

    public boolean equals(Livro livro) {
        if((this.Titulo == Titulo) & (this.ISBN == ISBN))
            return true;
        else
            return false;
    }  
}

Minha classe principal:

import br.ifrn.edu.poo.classes.Livro;
import java.util.Scanner;

    public class Biblioteca {

    public static void main(String[] args) {
      
        Scanner leia = new Scanner(System.in);
        Livro livro1 = new Livro();
        Livro livro2 = new Livro();
        
        System.out.println("Livro 1: ");
        System.out.print("Titulo: ");
        livro1.setTitulo(leia.nextLine());
        System.out.print("ISBN: ");
        livro1.setTitulo(leia.nextLine());
        
        
        System.out.println("Livro 2: ");
        System.out.print("Titulo: ");
        livro2.setTitulo(leia.nextLine());
        System.out.print("ISBN: ");
        livro2.setTitulo(leia.nextLine());
        
        if(livro1.equals(livro2) == true)
            System.out.println("Os dois livros são iguais!");
        else
            System.out.println("Os dois livros são diferentes!");
        
        
    }
}

O codigo está sempre retornando "Os dois livros são iguais!"

5 Respostas

S

Boa noite,

Primeiro vou explicar o erro na sua classe Livro. Você no seu método equals estava comparando o titulo do mesmo objeto, por isso que sempre ele retornava o livro igual, pois a referencia dos objetos sempre apontava para o mesmo endereço de memoria (Por causa do ==, vou chegar lá). Para funcionar você deve implementar os métodos GET na sua classe livro e no método equals você deve perguntar se o titulo é igual ao getTitulo do objeto livro que você passa como parametro. Com isso a comparação não pode ser feita com ==, pois o == irá comparar o endereço de memoria que nesse caso sempre sera diferente pois você irá trablhar com 2 objetos livros distintos. Para comparação ser realizada com sucesso você deve usar o proprio método equals.

public class Livro {
	private String Titulo;  
    private String ISBN;  
  
    public void setISBN(String ISBN) {  
        this.ISBN = ISBN;  
    }  
  
    public void setTitulo(String Titulo) {  
        this.Titulo = Titulo;  
    }  
    
    public String getTitulo() {
    	return this.Titulo;
    }
    
    public String getISBN() {
    	return this.ISBN;
    }
    
  
    public boolean equals(Livro livro) {  
        if((this.Titulo.equals(livro.getTitulo()) ) & (this.ISBN.equals(livro.getISBN())))  
            return true;  
        else  
            return false;  
    } 
}

E na sua classe biblioteca você estava chamando o setTitulo sempre e esqueceu de usar o setISBN. Ficando da seguinte forma:

public class Biblioteca {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner leia = new Scanner(System.in);  
        Livro livro1 = new Livro();  
        Livro livro2 = new Livro();  
          
        System.out.println("Livro 1: ");  
        System.out.print("Titulo: ");  
        livro1.setTitulo(leia.nextLine());  
        System.out.print("ISBN: ");  
        livro1.setISBN(leia.nextLine());  
          
          
        System.out.println("Livro 2: ");  
        System.out.print("Titulo: ");  
        livro2.setTitulo(leia.nextLine());  
        System.out.print("ISBN: ");  
        livro2.setISBN(leia.nextLine());  
          
        if(livro1.equals(livro2))  
            System.out.println("Os dois livros são iguais!");  
        else  
            System.out.println("Os dois livros são diferentes!"); 

	}

}

Qualquer duvida é so falar.

Abraço

Henrique.tenorio

public boolean equals(Livro livro) { if((this.Titulo == Titulo) & (this.ISBN == ISBN)) return true; else return false; }

O método equals não esta sobrescrito e sim sobrecarregado!, o correto é:

public boolean equals(Object obj) {

        if (obj instanceof Livro) {
            if ((this.Titulo == ((Livro)obj).Titulo) & (this.ISBN == ((Livro)obj).ISBN)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
ViniGodoy

Existem algumas condições que devem ser satisfeitas para o equals:
1. O equals deve sempre retornar false se o outro objeto for nulo;
2. O equals deve sempre retornar false para um objeto de uma classe diferente (o teste não deve ser feito com instanceof);
3. O equals deve sempre retornar true se o objeto estiver sendo comparado com ele mesmo;
4. Sempre que o equals for sobrescrito, você deve sobrescrever o hashcode;

Outra coisa. Fazer:
if (condicao) 
    return true;
else
   return false;
É o mesmo que simplesmente:
return condicao;
Assim:
public boolean equals(Object obj) {
    if (obj == this)
       return true;
    if (obj == null || obj.getClass() != getClass())
       return false;

    Livro livro = (Livro)obj;
    return getTitulo().equals(obj.getTitulo()) && getISBN().equals(livro.getISBN());
}

Já para o método do hashCode, você pode seguir essas dicas:
http://www.guj.com.br/java/52485-hashcode-duvida#276120

ViniGodoy

Por favor, não banalize as tags informativas do fórum usando para dizer o óbvio, como [Dúvida] ou [Problema].

thankd

Obrigado a todos que responderam, agora entendi como funciona! vlw :smiley:

Criado 16 de dezembro de 2011
Ultima resposta 17 de dez. de 2011
Respostas 5
Participantes 4