Adicionar Funcionario em um Array da classe Empresa

Olá pessoal, eu estou usando uma apostila e no meio dela exisitia um exercicio, onde eu devia add um funcionario em um array da classe Empresa, bom. segue o codigo:

Empresa:

class Empresa {
	String cnpj;
	Funcionario[] funcionarios;
	int i;

	void adiciona(Funcionario f) {
		if (i < funcionarios.length) {
			funcionarios[i] = f;
			i++;
		}
		else {
			System.out.println("Vetor cheio!");
		}
	}
	
	int quantidadeFuncionarios() {
		return i;
	}	

	void mostraFuncionarios() {
		for(int j=0; j<i; j++) {
			System.out.println(funcionarios[j].nome);
			System.out.println(funcionarios[j].depto);
			System.out.println(funcionarios[j].salario);
			System.out.print(funcionarios[j].dataDeEntrada.dia);
			System.out.print("/"+funcionarios[j].dataDeEntrada.mes+"/");
			System.out.println(funcionarios[j].dataDeEntrada.ano);
			System.out.println(funcionarios[j].RG);
			System.out.println(funcionarios[j].estaNaEmpresa+"\n");
		}
	}
}

Funcionario:

class Funcionario {
	String	nome;
	String	depto;
	double  salario;
	Data	dataDeEntrada = new Data();
	String	RG;
	boolean	estaNaEmpresa;


	boolean bonifica(double valor) {
		boolean bonificar = this.estaNaEmpresa;
		
		if (this.estaNaEmpresa) {
			this.salario += valor;
			return true;
		}
		else {
			return false;
		}		
	}
	

	boolean demite () {
		if (this.estaNaEmpresa) {
			this.estaNaEmpresa = false;
			return true;
		}
		else {
		return false;
		}
	}

	void mostrar() {
		System.out.println("\nNome: "+ this.nome);
		System.out.println("Depto: "+ this.depto);
		System.out.println("Salario: "+ this.salario);
		System.out.println("Data Admissao: "+ this.dataDeEntrada.dia +"/"+ this.dataDeEntrada.mes + "/"+ this.dataDeEntrada.ano);
		System.out.println("RG: "+ this.RG);
		System.out.println("Status: "+ estaNaEmpresa);
	}
}

TestaEmpresa ou main:


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

	
	Empresa e1 = new Empresa();

	// faz a referencia ao array e estipula sua quantidade de posições do mesmo
	e1.funcionarios = new Funcionario[2];

	Funcionario f1 = new Funcionario();
		f1.nome = "Arthur";
		f1.depto = "Desenvolvimento";
		f1.salario = 1000;
		f1.dataDeEntrada.dia = 10;
		f1.dataDeEntrada.mes = 03;
		f1.dataDeEntrada.ano = 2007;
		f1.RG = "RG 100";
		f1.estaNaEmpresa = true;

	Funcionario f2 = new Funcionario();
		f2.nome = "Joaquim";
		f2.depto = "Desenvolvimento";
		f2.salario = 1200;
		f2.dataDeEntrada.dia = 02;
		f2.dataDeEntrada.mes = 12;
		f2.dataDeEntrada.ano = 2005;
		f2.RG = "RG 101";
		f1.estaNaEmpresa = false;

	e1.adiciona(f1);
	e1.adiciona(f2);

	System.out.println("Quantidade de Funcionário na Empresa " +e1.quantidadeFuncionarios()+"\n");
	e1.mostraFuncionarios();
	}
}

Gostaria de saber se vocês poderiam me ajudar a deixar esse código mais ‘elegante possivel’, acho que ficou muito complicado do modo que foi escrito.

ps.: o exercicio pedia para que tivesse sido feito com arrays

Eu utilizaria um ArrayList ou Vector. De uma pesquisada em um deles e vc vera q o codigo ficara mais elegante.

Te aconselho sempre que possível usar os construtores pois te ajudam bastante!Notei uma pequena falha no metodo adiciona

 void adiciona(Funcionario f) {   
        if (i < funcionarios.length){ aqui o resulta sempre ira ser true concorda?   
            funcionarios[i] = f;   
            i++;   
        }   
        else {   
            System.out.println("Vetor cheio!");   
        }   
    } 

Com toda certeza terás uma exceção qd passar do tamanho declarado.Como vc vai ver eu usei um metodo booleano que é muito bom nessa horas,afinal vc tem que saber se a operação de adicionar teve exito!
como o nosso amigo falou acima seria melhor usar um Conjunto mas provavelmente o foco do exercicio é sobre vetores, então não faria sentido o seu uso.Mais uma coisa, sobrescreve o metodo public String toString()
ajuda muito!Esse metodo mostras os atributos mais importantes de um objecto é so chamar System.out.println(object).Os outros teus metods deixei como estão.
Então eu fiz assim:

class Data{
   private int dia,mes,ano;
    Data(){
        
    }
    Data(int x,int m,int a){
       dia=x;
       mes=m;
       ano=a;
    }
    public String toString(){//retorna os atributos relevantes do seu objeto!!!
        return " dia:"+dia+"\mes:"+mes+"\ano:"+ano;
    }
    //deve-se acrescentar os vários sets e gets para uma boa     programação    O.O. acostumese sempre a isso
} 

classe Funcionario

class Funcionario {   
   private String  nome;//nao vai querer mudanças estranhas!!   
   private String  depto;   
   private double  salario;;//nao vai querer mudanças estranhas!!   
   private  Data  dataDeEntrada;   
   private String  RG;   
   private boolean estaNaEmpresa;   
  
    Funcionario(String n,String d,double s,Data e,String r,boolean b){
        nome=n;
        depto=d;
        salario=s;
        dataDeEntrada=e;
        RG=r;
        estaNaEmpresa=b;
    }
    Funcionario(){
        
    }
    
  public  boolean bonifica(double valor) {   
        boolean bonificar = this.estaNaEmpresa;   
           
        if (this.estaNaEmpresa) {   
            this.salario += valor;   
            return true;   
        }   
        else {   
            return false;   
        }         
    }   
       public String toString(){
       return "Nome:"+this.nome+"\n"+ "Depto: "+this.depto+"\n"+"Salario:"+this.salario+"\n"+"Data Admissao:"+this.dataDeEntrada+"\n"+"Rg:"+this.RG+"\n"+"Status: "+this.estaNaEmpresa+"\n";    
       }
  
    boolean demite () {   
        if (this.estaNaEmpresa) {   
            this.estaNaEmpresa = false;   
            return true;   
        }   
        else {   
        return false;   
        }   
    }   

    public Data getDataDeEntrada() {
        return dataDeEntrada;
    }

}

classe Funcionario ja com costrutor sobrecarregado com o vetor

public class Empresa {   
    String cnpj;   
    Funcionario[] funcionarios;

    Empresa(Funcionario[] f){
        funcionarios=f;
    }
    boolean adiciona(Funcionario f) {
      
       for(int i=0;i<funcionarios.length;i++){//procura a proxíma posição vazia no vetor para poder acrescentar novo funcionário
              if(funcionarios[i] == null){
                 funcionarios[i] = f;
               return true;
              }
              
       }
        return false;      
              
    }               
       
  public  int quantidadeFuncionarios() {
       return funcionarios.length;   
    }     
  
   public void mostraFuncionarios() {   
        for(Funcionario f:funcionarios)    
         System.out.println(f);// aqui vc nao presisa fazer aquela referencia  explicita para os atributos lembra?Agora o println() faz tudo!!  
     
           
    }  

    public String getCnpj(){
        return cnpj;
    }
    public static void main(String...q){
      
        Funcionario[] fun=new Funcionario[10];
        Empresa e=new Empresa(fun);
        fun[0]=new Funcionario("HULK","AREA 51",2000,new Data  (2,01,1977),"89300427 ",true);
        fun[1]=new Funcionario("BATMAN","AREA 52",4000,new Data(22,10,1980),"839430042 ",true);
        Funcionario f=new Funcionario("Ken schiro","AREA 45",1200,new Data(11,8,1983),"83981080",true);
        System.out.println(e.adiciona(f));
        e.mostraFuncionarios();
        }
    
}

:wink:

po cara se vc tivesse usando ArrayList facilitava mais e a manutenção era mais facil!!