Sim Sim!
Tinham algumas falhas conceituais e de sintaxe lá! Falha minha! >.<
Não falei de equals() pois, como eu havia dito, eu não queria fugir do escopo do tópico. E o "this", de fato, não é obrigatório nesse caso, mas é considerado boa prática sempre usá-lo.
E de fato, eu também achei esquisito comparar funcionários pelo nome. Então eu acho que seria uma boa hora para explicar o equals().
Primeiramente, o que é uma igualdade né? O que faz com que duas coisas sejam iguais? Provavelmente você tem muitas respostas para isso, pois isso pode variar de situação em situação.
Por exemplo: Dadas duas variáveis do tipo inteiro x e y, o que faz com que a operação (x == y) retorne True? Em outras palavras, qual o conceito de igualdade entre dois inteiros? Simples! Basta que o valor desses inteiros sejam equivalentes!
Seguindo o mesmo raciocínio, dadas duas variáveis de referência, f1 e f2, que apontam, cada uma, para um objeto do tipo Funcionario.
Agora, como nós estamos tratando de objetos, não podemos iguala-los com o operador "==". Por isso existe um método herdado da classe Object (pesquisar sobre a classe Object), que toda classe possui, chamado equals().
Então, retomando o raciocínio, podemos agora igualar o f1 e f2 desta maneira: f1.equals(f2) (lê-se "f1 é igual a f2?"). Mas o que será que vai retornar, julgando que os objetos de f1 e f2 possuem os valores dos seus atributos idênticos?
FALSE! Sim! False! Mais uma vez... False!
"Ué! Mas por que?"... Lembra quando eu fiz isso com as variáveis do tipo inteiro e perguntei "qual o conceito de igualdade entre dois inteiros"? Então, agora me responda: qual o conceito de igualdade entre dois Funcionarios?
Para entender, experimente dar System.out.println(f1), por exemplo. O retorno vai ser algo do tipo: Funcionario@57c4f74a.
"Mas que p**** é essa?"
Respectivamente, o tipo da classe do objeto, e seu HashCode(pesquise). Isso funciona como um tipo de ID do objeto, que fica armazenado na sua variável de referência. Entenda isso como um pequeno mapa que explica a direção para determinado objeto. E esse mapa fica com a variável de referência que está apontando para este objeto.
"O que que isso tem a ver com o equals()?"
Simples! O equals() original, ou seja, se não for sobreescrito, ele comparar esse ID do objeto nas duas variáveis. Por isso que se você fizer com que f2 aponte para o mesmo objeto de f1 (f2 = f1), o f2 receberá o ID do objeto que o f1 aponta e apartir desse momento o equals() será true. Entendeu? Deu true porque o as duas variáveis apontam para o mesmo objeto, pois ambos tem o mesmo ID.
"Beleza! Saquei isso... mas o que eu tenho que fazer pra quando eu chamar o equals() ele testar apenas aquilo que eu quero?"
Simples! Sobreescreva o equals()! No exemplo do Altom, ele compara os Funcionarios pelo nome. Logo, para ele, o conceito de igualdade entre Funcionarios é que se dois funcionarios possuem nomes idênticos, os mesmos são iguais. Neste caso, então, reescreveríamos o equals() desta maneira:
public class Funcionario{
// seus métodos e atributos
public boolean equals(Object obj) { // Recebe qualquer classe do tipo Object (Pesquise sobre a classe Object)
Funcionario funcionario = (Funcionario) obj; // Faz casting do tipo Object para o tipo Funcionario
if (this.getNome().equals(funcionario.getNome()) { // Testa se os nomes coincidem
return true; // Retorna True se verdadeiro
}
return false; // Retorna False se falhar no teste
}
}
Pronto! Agora, sempre que você quiser igualar 2 objetos do tipo Funcionario com o equals(), o código acima irá rodar e lhe passar o resultado de acordo com os dados que você informou.
Entende agora? Tudo depende do seu conceito de igualdade. Mesmo assim, eu continuo achando que comparar dois Funcionários pelo nome pode não dar certo. Experimente criar um campo chamado ID, e gerar um ID único para cada Funcionário.
Anyway... Passei o conhecimento adiante, mas acho que vale a pena você pesquisar bastante Altom. Recomendo a leitura do livro Head First Java, ou então procure baixar uma apostila gratuita na internet!
Bom... espero ter ajudado!
[]'s