Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Exercicio 6: Função contem() - True e false não é retornado

Bom dia pessoal,

Quando utilizo o método contem(), o mesmo não retorna "false" ou "true". Quando é passado um funcionário que não existe, o programa não compila e retorna o seguinte erro :

TesteEmpresa.java:37: error: cannot find symbol
          citel.contem(desenv10);
                       ^
  symbol:   variable desenv10
  location: class TesteEmpresa
1 error

Quando é passado um funcionário existente o programa compila mas não é retornado "true".

Gostaria de saber porque isso acontece. O certo não era pra ser retornado true ou false? Segue código abaixo:

obs: Utilizo java 1.8

Classe Empresa

public class Empresa{

    String nome;
    String cnpj;
    Funcionario funcionarios[];
    int cont_funcionario = 0;

void adiciona(Funcionario funcionario){
    this.funcionarios[this.cont_funcionario] = funcionario;
    this.cont_funcionario++;

    }

void mostraTodasAsInformacoes() {
    for (int i = 0; i < this.cont_funcionario; i++) {
        if(funcionarios[i] == null) continue;
        System.out.println("\n\nFuncionário na posição: " + i);
        this.funcionarios[i].mostra();
    }
}

boolean contem(Funcionario f) {
        for (int i = 0; i < this.cont_funcionario; i++) {
            if (f == funcionarios[i]) {
                return true;
            }
        }
        return false;
    }
}

Classe TesteEmpresa

public class TesteEmpresa{
    public static void main (String [] args){

        Empresa citel = new Empresa();
        citel.funcionarios = new Funcionario[20];

        Funcionario desenv1 = new Funcionario();
         desenv1.data = new Data();

            desenv1.nome = "Roberto";
            desenv1.salario = 15000;
               desenv1.data.preencheData(1,1,2004);
               citel.adiciona(desenv1);

               Funcionario desenv2 = new Funcionario();
         desenv2.data = new Data();

            desenv2.nome = "Rafa";
            desenv2.salario = 13000;
               desenv2.data.preencheData(6,10,2006);
               citel.adiciona(desenv2);

               Funcionario desenv3 = new Funcionario();
         desenv3.data = new Data();

            desenv3.nome = "Israel";
            desenv3.salario = 10000;
               desenv3.data.preencheData(6,6,2009);
               citel.adiciona(desenv3);

citel.contem(desenv1);

    }
}
5 respostas

Olá Francisco Hugo! Veja bem, não está retornando true porque você está utilizando == quando o correto seria você utilizar o método equals() pois se trata de um objeto. Quando utilizamos == para se comparar dois objetos, na verdades nós comparamos as variaveis, e por serem variaveis diferentes, pois ocupam espaços na memória diferentes, ele retorna false. Quando utilizamos o método equals(), nós comparamos o conteúdo, o objeto em si. Assim, você pode sobrescrever o método equals em sua classe Fucionario para determinar a regra de negócio que fará dois funcionário serem iguais. Espero ter ajudado! Bons Estudos!

Romário,

Obrigado pela ótima explicação, mas fiquei na dúvida na parte que você diz que eu tenho que sobrescrever o método equals().

Eu alterei o método contem() da seguinte forma:

boolean contem(Funcionario f) {
        for (int i = 0; i < this.cont_funcionario; i++) {
            if (f.equals( funcionarios[i])) {
                return true;
            }
        }
        return false;
    }
}

Mas porém o efeito é o mesmo do caso anterior. Poderia me dar um exemplo de como sobrescrever o método equals() por favor?

Obrigado!

solução!

Veja bem Francisco, toda classe em java ja possui o método equals(). Porque toda classe herda da classe Object e esta classe possui o método equals() implementado. Porem o método da classe Object, simplesmente compara as referencias na memória, da mesma forma como você fez anteriormente. Veja abaixo o método equals da classe Object:

public boolean equals(Object obj) {
        return (this == obj);
    }

Então, o que fazemos é sobrescrever esse método na classe funcionário, para que nós definamos a regra de negócio que dirá se um objeto é igual ao outro. Veja o exemplo que eu fiz abaixo, eu sobrescrevi o método equals() para que se os funcionários tiverem o mesmo nome eles serão iguais, caso tenha o nome diferente eles serão diferentes:

    @Override
    public boolean equals(Object obj) {
        Funcionario outroFuncionario = (Funcionario) obj;
        return this.nome == outroFuncionario.nome;
    }

Posso fazer por nome e rg também:

@Override
    public boolean equals(Object obj) {
        Funcionario outroFuncionario = (Funcionario) obj;
        return this.nome == outroFuncionario.nome && this.rg == outroFuncionario.rg;
    }

Você sobrescrevendo o método, fica a seu critério a regra de negócio para a comparação de serem iguais ou não.

Espero ter ajudado. Bons Estudos!

Romário,

Muito obrigado ajudou bastante, vou refazer os meus testes.

Obrigado!!!

Romário, se eu tenho que usar equals() para fazer a comparação, por que a resposta do exercício indica o uso simples do "==" ? Veja abaixo resposta do exercício:

boolean contem(Funcionario f) { for (int i = 0; i < this.livre; i++) { if (f == this.empregados[i]) { return true; } } return false; }

Fico aqui horas tentando fazer o programa funcionar, achando que errei alguma coisa e o curso que ensinou errado? Poderia ser acertado?