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

Dúvida no Ex. 6 da Aula 5 - Modificadores de acesso -

Pessoal, ao colocar o private na variável:

private Funcionario[] empregados;

Da classe empresa, tive o seguinte erro:

TestaFuncionario.java:139: error: empregados has private access in Empresa
                empresa.empregados = new Funcionario[10];
                       ^
TestaFuncionario.java:154: error: empregados has private access in Empresa
                empresa.contem(empresa.empregados[5]);
                                      ^
2 errors

Este erro acontece na missa Classe : "TestaFuncionario". Por ser uma array, como passo a referência do atributo na hora da construção da instância na minha classe principal? Abaixo o código completo:

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

    public String getNomeEmpresa(){
        return this.nomeEmpresa;
    }

    public void setNomeEmpresa(String nomeEmpresa){
        this.nomeEmpresa = nomeEmpresa;
    }

    public String getCnpj(){
        return this.cnpj;
    }

    public void setCnpj(String cnpj){
        this.cnpj = cnpj;
    }

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

    public void mostraEmpregados() {
        for(int i = 0; i < this.empregados.length; i++){
            if (this.empregados[i]!= null){
                System.out.println("Funcionario na posicao: " + i + " - " + this.empregados[i].getNome());
                System.out.println("R$ " + this.empregados[i].getSalario());
            }
        }
    }

    public void mostraTodasAsInformacoes() {
        for(int i = 0; i < this.empregados.length; i++){
            if (this.empregados[i]!= null){
                this.empregados[i].mostra();
            }
        }
    }

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

    private String nome;
    private String departamento;
    private double salario;
    private String rg;
    private Data dataEntrada;

    public String getNome(){
        return this.nome;
    }

    public void setNome(String nome){
        this.nome = nome;
    }

    public String getDepartamento(){
        return this.departamento;
    }

    public void setDepartamento(String departamento){
        this.departamento = departamento;
    }

    public double getSalario(){
        return this.salario;
    }

    public void setSalario(double salario){
        this.salario = salario;
    }

    public String getRg(){
        return this.rg;
    }

    public void setRg(String rg){
        this.rg = rg;
    }

    public Data getDataEntrada(){
        return this.dataEntrada;
    }

    public void setDataEntrada(Data dataEntrada){
        this.dataEntrada = dataEntrada;
    }

    public void recebeAumento(double aumento){
        this.salario += aumento;

    }

    public double getGanhoAnual(){
        return this.salario*12;
    }

    public void mostra(){
        System.out.println ("Nome: " + this.getNome() + "\nDepartamento: " + this.getDepartamento() + "\nData Admiss\u00e3o: " + this.getDataEntrada().getFormatada()
        +"\nRG: " + this.getRg()+ "\nSalario: " +    this.getSalario() + "\nGanho Anual: " + this.getGanhoAnual()+"\n");
    }

}
class Data{
    int dia;
    int mes;
    int ano;

    public void recebeData (int dia, int mes, int ano){
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }

    public String getFormatada() {
        return this.dia + "/" + this.mes + "/" + this.ano;
    }       
}
class TestaFuncionario {
    public static void main (String[] args){

        Empresa empresa = new Empresa();
        empresa.empregados = new Funcionario[10];

        for (int i = 0; i < 5; i++){
            Funcionario f = new Funcionario();
            f.setNome("Jos\u00e9");
            f.setDepartamento("Custos");
            f.setSalario(1000.00+10*(i));
            f.setRg("A-33333333");
            Data data = new Data();
            data.recebeData(5,5,2008+i);
            f.setDataEntrada(data);
            f.recebeAumento(100);
            empresa.adicionaFuncionario(f);
        }
        empresa.mostraTodasAsInformacoes();
        empresa.contem(empresa.empregados[5]);
    }
}
8 respostas

Leonardo,

não no caso não poderá ser private .

mas na verdade o que acontece essa atribuição será feita no construtor da classe Empresa , logo está faltando na sua classe um construtor , tipo esse .

public Empresa ( String cnpj, String nome){

        this.cnpj = cnpj;
        this.nome = nome;
        this.empregados = new Funcionario[10];


    }

espero ter ajudado .

Então no caso o modificador de acesso não é o problema, oque eu consegui identificar é que seu método na classe empresa não espera um array de empregados (funcionarios) e sim espera apensa um funcionário, e verifica se seu funcionário esta na lista, lembrando que a sua verificação pode não dar certo pois verificação de objetos complexos deve ser usado:

 if (this.empregados[i].equals( f)) {
                    return true;
            }
solução!

Segue aqui minha classe para que vc tire suas próprias conclusões:

Empresa.java

class Empresa{
    private String nome;
    private String cnpj;
    private Funcionario[] funcionarios;
    private int posicao = 0;

    public Empresa(int tamanhoDoArray){
        this.funcionarios = new Funcionario[tamanhoDoArray];
    }

    public void setNome(String nome){
        this.nome = nome;
    }

    public String getNome(){
        return this.nome;
    }

    public void setCnpj(String cnpj){
        this.cnpj = cnpj;
    }

    public String getCnpj(){
        return this.cnpj;
    }

    public void setFuncionarios(Funcionario[] funcionarios){
        this.funcionarios = funcionarios;
    }

    public void adiciona(Funcionario f){
        this.funcionarios[this.posicao] = f;
        this.posicao++;
    }

    public void mostraEmpregados(){
        System.out.println("Empresa: "+nome);
        System.out.println("CNPJ: "+cnpj);
        System.out.println("");

        for(int i = 0; i < this.posicao; i++){
            System.out.println("Nome do Funcionario: "+this.funcionarios[i].getNomeDoFuncionario());
            System.out.println("RG: "+this.funcionarios[i].getRG());
            System.out.println("Salario: "+this.funcionarios[i].getSalario());
            System.out.println("Departamento: "+this.funcionarios[i].getDepartamentoOndeTrabalha());
            System.out.println("Data de Entrada no Banco: "+this.funcionarios[i].getDataDeEntradaNoBanco());
            System.out.println("");
        }
    }

    public void mostraTodasAsInformacoes(){
        System.out.println("Empresa: "+nome);
        System.out.println("CNPJ: "+cnpj);
        System.out.println("");

        for(Funcionario f : this.funcionarios){
            if(f == null) continue;
            f.mostra();
        }
    }

    boolean contem(Funcionario f){
        for(Funcionario fun : this.funcionarios){
            if(fun.getRG() == f.getRG() ){
                return true;
            }
        }
        return false;
    }
}

Celso a questão é que construtores é um assunto que será visto no capítulo adiante, então imagino que a solução seja de outra maneira. Mesmo assim obrigado

Vitor, Marcos vou testar aqui e ver se funciona. Obrigado

Bom, por enquanto, resolvi da seguinte maneira: Criei os o setter baseado na resposta do Marcos, e o getter baseado na resposta de exemplo do "professor". A princípio modifiquei minha classe Empresa e agora uso os metodo :

public Funcionario getEmpregados (int posicao) {
        return this.empregados[posicao];
    }

public void setFuncionarios(Funcionario[] empregados){
        this.empregados = empregados;
    }

Para manipular a referencia da array de Funcionários nos demais metodos. Só tive dúvida nos momentos onde uso a seguinte expressão na classe Empresa, por exemplo:

this.empregados.length / ou
this.empregados[this.livre] = f;

Pois ao encapsular as variáveis da classe, entendo que toda a manipulação das variáveis e acessos devam ser feitos por meios dos metodos (getters e setters), então não sei se há outra maneira mais "elegante" para isso. No mais foram as classes Empresa e a Testa Funcionário. Caso tenham alguma observação, me informem. vlw

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

    public String getNomeEmpresa(){
        return this.nomeEmpresa;
    }

    public void setNomeEmpresa(String nomeEmpresa){
        this.nomeEmpresa = nomeEmpresa;
    }

    public String getCnpj(){
        return this.cnpj;
    }

    public void setCnpj(String cnpj){
        this.cnpj = cnpj;
    }

    public Funcionario getEmpregados (int posicao) {
        return this.empregados[posicao];
    }

    public void setFuncionarios(Funcionario[] empregados){
        this.empregados = empregados;
    }

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

    public void mostraEmpregados() {
        for(int i = 0; i < this.empregados.length; i++){
            if (this.empregados[i]!= null){
                System.out.println("Funcionario na posicao: " + i + " - " + this.getEmpregados(i).getNome());
                System.out.println("R$ " + this.getEmpregados(i).getSalario());
            }
        }
    }

    public void mostraTodasAsInformacoes() {
        for(int i = 0; i < this.empregados.length; i++){
            if (this.getEmpregados(i)!= null){
                this.getEmpregados(i).mostra();
            }
        }
    }

    public boolean contem (Funcionario f){
        for(int i = 0; i < this.empregados.length; i++){
            if (this.getEmpregados(i)!= null){
                if (this.getEmpregados(i) == f ) {
                    System.out.println("SIM");
                    return true;
                }
            }
        }
        System.out.println("NAO");
        return false;
    }
}
class TestaFuncionario {
    public static void main (String[] args){

        Empresa empresa = new Empresa();
        Funcionario[] empregados = new Funcionario[10];
        empresa.setFuncionarios(empregados);

        for (int i = 0; i < 5; i++){
            Funcionario f = new Funcionario();
            f.setNome("Jos\u00e9");
            f.setDepartamento("Custos");
            f.setSalario(1000.00+10*(i));
            f.setRg("A-33333333");
            Data data = new Data();
            data.recebeData(5,5,2008+i);
            f.setDataEntrada(data);
            f.recebeAumento(100);
            empresa.adicionaFuncionario(f);
        }
        empresa.mostraEmpregados();
        empresa.mostraTodasAsInformacoes();
        empresa.contem(empresa.getEmpregados(5));
    }
}

Leonardo, só uma observação

Toda vez que você utiliza:

this.empregados.length

Você está dizendo ao laço para ir até o fim do array; imagine que este array possa ter um tamanho bastante grande de posições alocadas na memória, e vc tem poucos funcionários sendo referenciados pelas primeiras posições do array as demais posições com valores null. Neste caso mesmo sem precisão seu laço ira andar todas as posições do array desnecessariamente, podendo deixar seu programa com maior tempo de execução (mais lento).

Imagino que seria mais elegante vc utilizar o atributo:

this.livre

Ou seja;

for(int i = 0; i < this.livre; i++)

Como fiz em minha classe

Espero que tenha entendido sua dúvida e lhe ajudado com esta resposta.

Boa sugestão Marcos Ricardo Rodrigues, seu comentário para o Leonardo me ajudou na solução também. Abraço

Obrigado Marcos Ricardo Rodrigues, sua sugestão também solucionou minhas duvidas...