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

Java Primeiros Passos - Exercício 2 - Aula 04

Olá, a resposta do exercício é o seguinte :

class Empresa {
    Funcionario[] empregados;
    String cnpj;
    int livre = 0;

    void adiciona(Funcionario f) {
        this.empregados[this.livre] = f;
        this.livre++;
    }
}

Mas, fiz de modo diferente, fiz com o while (testei também com o for). Estaria errado fazer dessa maneira?!

class Empresa{
  Funcionario[] funcionario;
  String cnpj;

  funcionario = new Funcionario[3];

  public void adicionar(Funcionario funcionario){
    int posicao = 0;
    while(posicao <=3){
      this.funcionario[posicao] = funcionario;
      posicao++;
    }
  }
}
3 respostas

Oi Allan,

Não está errado não, você só precisa garantir que a posição esteja livre antes de inserir pois desta forma ele está inserindo o mesmo funcionário em todas as posições do array.

Abraço

Joviane, como eu garantiria essa "posição livre"?

Porque ao que eu vejo, o código sempre irá inserir em uma casa vazia, certo?

solução!

Oi Allan, estive analisando o seu código e espero poder ajudá-lo. Primeiramente, caso você tente compilar o seu código, aparecerá um erro por causa da seguinte linha:

funcionario = new Funcionario[3];

Você não pode fazer isso a forma que foi feito. Existem duas formas de "contornar" a situação. Sabemos que todo array é um objeto, então você pode criar o tal objeto já na declaração da variável do array, da seguinte forma:

class Empresa{
  Funcionario[] funcionario = new Funcionario[3];

É uma solução, mas o problema disso é que sempre que você criar um objeto Empresa, ele possuirá somente 3 funcionários. Caso você queira fugir disso e criar empresas com vários tamanhos de funcionários, você pode fazer o seguinte:

class Empresa {
    Funcionario[] funcionario;
    //outros atributos e métodos
}

class Programa {
    public static void main(String[] args) {
        //primeiro cria a empresa.
        Empresa empresa = new Empresa();
        //depois, cria o seu array.
        empresa.funcionario = new Funcionario[3];
    }
}

Posteriormente, você verá que nem mesmo o código acima é uma boa prática, por questões relacionadas ao que chamamos de "Encapsulamento". Mas como você está começando com Java, não se preocupe com isso.

Fiz algumas modificações no seu código usando o seu método adicionar.

class Funcionario {
    private String nome;

    public Funcionario(String x) {
        this.nome = x;
    }

    @Override
    public String toString() {
        return this.nome;
    }
}


class Empresa {
    private Funcionario[] funcionario = new Funcionario[3];
    private String cnpj;

    public void adicionar(Funcionario f){
        int posicao = 0;
        while(posicao < 3) {
            this.funcionario[posicao] = f;
            posicao++;
        }
    }

    public Funcionario getFuncionario(int i) {
        return this.funcionario[i];
    }
}

class Testando {
    public static void main(String[] args) {
        Funcionario f1 = new Funcionario("José");
        Empresa e1 = new Empresa();

        e1.adicionar(f1);
        System.out.println(e1.getFuncionario(0));
        System.out.println(e1.getFuncionario(1));
        System.out.println(e1.getFuncionario(2));
    }
}

Note que trocamos o posicao <= 3 por posição < 3, isso porque, como o Array possui 3 "lugares", só temos as posições 0, 1 e 2. A posição 3 é inexistente e aí ocorre um erro de compilação. Peço também que você ignore os métodos usados na classe Funcionario, posteriormente, você aprenderá mais sobre tais métodos. O resultado que queríamos era:

José
null
null

Mas o resultado do seu método, deu:

José
José
José

Ou seja, você não adicionou José em uma posição do Array, você adicionou o José em todas as posições do Array. Para resolver isso, podemos fazer:

    public void adicionar(Funcionario f){
        int posicao = 0;
        while(posicao < 3) {
            if(this.funcionario[posicao] == null) {
                this.funcionario[posicao] = f;
                break;
            }
            posicao++;
        }
    }

O que o código acima faz é: ele checa cada posição menor que 3, caso a posição encontrada, seja nula, ele adiciona o objeto no array e quebra o while (break), caso a posição não seja nula, ele simplesmente passa para a próxima e faz o processo novamente. Caso tenha duvidas ou encontre algum erro no meu post, sinta-se a vontade para me avisar!