Comparação de objetos

11 respostas
A

ola pessoal, como vão todos?

bem, me cadastrei neste fórum pois estou iniciando meu aprendizado com a linguagem Java.

estou com uma duvida, espero que possam me ajudar: Como faço para comparar OBJETOS?

Por exemplo: Criei um objeto Medico (contém nome, telefone e especialidade, todos strings). Qdo instanciar 2 médicos “identicos”, como posso comparar? q método utilizo? e se eu não souber que é um “objeto médico?”, q faço?

Grato pela atenção :razz: :wink:

11 Respostas

R

Oi..., primeiramente seja bem vindo(a) ao PJ :wink:

Vc pode estar sobrescrevendo o metodo equals.

Segue um exemplo :wink:
public boolean equals(Object obj) {
    if(obj == null) {
         return false;
     }

     boolean retorno = true;
     //Faz o cast 
     Medico med = (Medico) obj;

      //COmpara Nome
      if(this.getNome() == null && med.getNome() != null)
         retorno = false;
      if(this.getNome() != null && med.getNome() == null)
         retorno = false;
      if(this.getNome() != null) {
         if(!this.getNome().equals(med.getNome())) {
             retorno = false;
         }
      }
      return retorno;
}

Abracos

G

Se voce nao souber se o objeto é do tipo medico, vc pode usar o

operador “” instanceof “” para verificar se o objeto é do tipo medico .

G

não sei se é a melhor solução, mas existe também o metodo getClass(), que retorna a classe à qual pertence o objeto

A

Primeiro obrigado pelas boas vindas :grin:

Segundo: Pelo que entendi, o segredo mesmo é você “saber” com que classe está trabalhando, certo? (para isso pode-se usar o InstanceOf…)

Caso contrário (por exemplo, algo genérico, que compara o conteúdo de duas classes qualquer) não existe, certo?

Um abraço :cool:

G

cuidado com o instanceof… eh tudo minusculo.
Se tem alguma coisa genérica eu nao conheço

R

“Anonymus_rs”:
Primeiro obrigado pelas boas vindas :grin:

Segundo: Pelo que entendi, o segredo mesmo é você “saber” com que classe está trabalhando, certo? (para isso pode-se usar o InstanceOf…)

Caso contrário (por exemplo, algo genérico, que compara o conteúdo de duas classes qualquer) não existe, certo?

Um abraço :cool:

se um objeto é de uma classe e vc quer compara-lo com um objeto de outra classe, é óbvio que eles são diferentes

seria o mesmo que comparar um dedo a uma geladeira

A

“microfilo”:
“Anonymus_rs”:
Primeiro obrigado pelas boas vindas :grin:

Segundo: Pelo que entendi, o segredo mesmo é você “saber” com que classe está trabalhando, certo? (para isso pode-se usar o InstanceOf…)

Caso contrário (por exemplo, algo genérico, que compara o conteúdo de duas classes qualquer) não existe, certo?

Um abraço :cool:

se um objeto é de uma classe e vc quer compara-lo com um objeto de outra classe, é óbvio que eles são diferentes

seria o mesmo que comparar um dedo a uma geladeira

sim sim, isso sem duvida :lol:

o fodz pra mim é o seguinte: criar uma lista generica (de objetos), que faça comparações entre objetos da lista. c eu sei que os objetos são da classe médico, posso comparar o nome, especialidade e telefone. se eu sei que os objetos são da classe paciente, posso comparar nome, idade e telefone. agora, se eu não souber qual a classe que será comparada os objetos (são da mesma classe, objects) como faço para comparar???

exemplo: tem dois medicos (mas “eu” não sei isso), como faço para compara-los???

um abraço :razz:

R

se vc não se atualizou e não usa generics, isso é um problema, vc vai ter que testar usando instanceof, ver se da pra converter em médico ou em paciente e aí então testar

H

Esclarecendo um pouco,

Para comparar objetos, usa-se o método equals(), herdado de Object. O código que renan_daniel mostrou está quase apropriado: ele pode lançar um ClassCastException em tempo de execução se o objeto passado não for do tipo Medico. Segue um código válido:

// sobreescrevendo o equals herdado de Object
public boolean equals(Object o) {

    // primeiro, teste se o objeto passado é null
    if(o != null) {

        // agora, teste se "o" é um Medico
        if(o instanceof Medico) {
            
            // o cast aqui é válido
            Medico m = (Medico) o;
            
            boolean sameName = this.getName().equals(m.getName());
            boolean samePhoneNumber = this.getPhoneNumber().equals(m.getPhoneNumber());
            boolean sameSpeciality = this.getSpeciality().equals(m.getSpeciality());

            // neste exemplo, "this" e "o" serão iguais se tiverem o mesmo
            // nome, telefone e especialidade
            return sameName && samePhoneNumber && sameSpeciality;
        }   
    }
    
    // se a execução chegou até aqui, é porque "o" não é igual
    return false;
}

Pronto. Acredito que o código acima resolva seu problema. Tecnicamente, é recomendado que o método public int hashCode(), também de Object, seja sobreescrito. Explicar o quê são e para o quê servem hashcodes é uma historinha comprida, mas para seu caso, creio que o seguinte método seja bom o bastante:

public int hashCode() {
    int nameHashCode = this.getName().hashCode();
    int phoneNumberHashCode = this.getPhoneNumber().hashCode();
    int specialityHashCode = this.getSpeciality().hashCode();

    return nameHashCode + phoneNumberHashCode + specialityHashCode;
}

Espero tê-lo ajudado, e sem mais,

R

cuidado ao usar hashCode, para nunca poder ter dois objetos com o mesmo hashCode mas propriedades diferentes

H

Na verdade, o ideal é que não haja colisões de hashcodes, mas não é um problema se houver. O contrato de igualdade em Java diz que se x.equals(y) for true, x.hashCode() == y.hashCode() também deverá ser. Mas a recíproca não é verdadeira. Em português, se dois objetos forem considerados iguais, deverão ter hashcodes iguais, mas o contrário não é necessariamente verdadeiro.

Dois objetos diferentes podem ter o mesmo hashcode. A idéia do hashcode é criar um inteiro que possa ser usado como identificador da instância. Isso torna buscas pelo objeto mais rápidas, pois é mais fácil comparar inteiros do que Strings ou objetos. Mas como não é possível garantir a geração de hashcodes únicos para cada objeto, principalmente de tipos diferentes, ele não é um critério necessário ou suficiente para garantir a igualdade.

Enfim, hashcodes únicos para todos os seus objetos é legal, mas não perca seu tempo se preocupando com isso.

Criado 12 de outubro de 2004
Ultima resposta 17 de out. de 2004
Respostas 11
Participantes 6