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

Problema no Exercício 2 da Aula 5 do curso Java I. (Setter e Getter para o atributo "dataDeEntrada")

Boa tarde Amigos.

Travei em um dos exercícios e preciso de uma luz de vocês para prosseguir minha jornada.

No exercício 2 da aula 5 de Java I, é pedido que criemos Getters e Setters para que os atributos da classe "Funcionários" possam receber modificadores de visibilidade ("Private") e não possam ser modificados em outras classes sem passar pelos métodos. Para todos os outros atributos ("fun.nome", "fun.departamento", etc), consegui realizar o prcesso de forma rápida e fácil. Quando cheguei no atributo com a data de entrada me perdi.

Ao criarmos o objeto da classe Funcionário ("fun"), ele atribui ao "dataDeEntrada" um novo objeto criado na classe Data. Enquanto o atributo "dataDeEntrada" está com modificador "Public", consigo realizar o processo normalmente através da classe "TesteEmpresa". Ao tornar ele Private, não consigo atribuir ao dataDeEntrada o objeto criado. Não sei acessar o objeto que ele criou passando pelo "setDataDeEntrada".

No código abaixo está o dataDeEntrada funcionando com o modificador Public. Vou colocar um comentário com o código que estou tentando quando coloco o atributo em Private.

public class Empresa {
    String nome;
    String cnpj;
    Funcionario[] empregados;    

    int livre = 0;

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

    void mostraEmpregado() {
        for (int i = 0; i < this.empregados.length; i++) {
            System.out.println("Funcionário na posição: " + i);
            System.out.println("Salário: R$" + empregados[i].getSalario());
        }
    }

    void mostraTodasAsInformacoes() {
        for (int i = 0; i < this.empregados.length; i++) {
            System.out.println("Funcionário na posição: " + i);
            this.empregados[i].mostra();
        }
    }

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

}

public class Funcionario {
    private String nome;
    private String departamento;
    private double salario;
    public Data dataDeEntrada = new Data();
    private String rg;

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

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

    public void mostra() {
        System.out.println("Nome: " + this.nome);
        System.out.println("Departamento: " + this.departamento);
        System.out.println("Salário: " + this.salario);
        System.out.println("Admissão: " + this.getDataDeEntrada().getFormatada());
        System.out.println("RG: " + this.rg);
        System.out.println("***");
    }

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

    public String getNome() {
        return nome;
    }

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

    public String getDepartamento() {
        return departamento;
    }

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

    public double getSalario() {
        return salario;
    }

    public void setDataDeEntrada(Data dataDeEntrada) {
        this.dataDeEntrada = dataDeEntrada;
    }

    public Data getDataDeEntrada() {
        return this.dataDeEntrada;
    }

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

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

}

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

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

    String getFormatada() {
        return this.dia + "/" + this.mes + "/" +this.ano;
    }

}

class TesteEmpresa {
    public static void main(String[] Args) {
        Empresa emp = new Empresa();
        emp.nome = "D. Technology";
        emp.cnpj = "20.000.111/00001-20";
        emp.empregados = new Funcionario[10];

        for (int i = 0; i < 10; i++) {
            Funcionario fun = new Funcionario();
            fun.setNome("João da Silva " + i);
            fun.setDepartamento("Departamento Pessoal");
            fun.setSalario(100 + i);
            fun.dataDeEntrada.preencheData(1, 2, 2018);
            //fun.setDataDeEntrada(fun.dataDeEntrada.preencheData(1, 2, 2018));
            fun.setRg("1300099"+i);

            emp.adiciona(fun);
        }

        emp.mostraEmpregado();
        emp.mostraTodasAsInformacoes();

    }
}

Quem puder me iluminar, serei eternamente grato. :)

2 respostas
solução!

Oi Douglas,

Como o atributo vai passar a ser private, para acessá-lo você vai precisar utilizar o método get, que é o método a ser utilizado quando queremos acessar uma informação de um objeto:

//recupera a data de entrada do funcionario e chama o metodo preencheData
 fun.getDataDeEntrada().preencheData(1, 2, 2018);

Bons estudos!

Bom dia Rodrigo.

A solução era muito mais fácil do que eu estava pensando. Vi em algum outro comentário que a pessoa criava um novo objeto Data e o atribuía ao da classe Funcionário através do método setDataDeEntrada. Fiquei receoso, porque o atributo dataDeEntrada estaria Private na classe Empresa, mas este novo objeto criado era Public. Não fez muito sentido para mim.

Quanto a buscar o atributo através do getDataDeEntrada e atribuir o preencheData a ele fez todo sentido. Só não pensei nisso porque na minha cabeça um getter não poderia ser usado para alterar os valores do atributo. Por alguma razão na minha cabeça enxerguei getter e setter como vias de mão única. Só poderia alterar o valor com setter e receber o valor com getter.

De qualquer forma, muito obrigado pela ajuda. Por fim, nos exercícios posteriores cria-se um costrutor na classe Data que faz essa solução não ser mais usada, mas... vale pelo aprendizado.

Novamente meu MUITO OBRIGADO.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software