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

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

public class Data2 {

    private int dia;
    private int mes;
    private int ano;


    public void setPreencheData(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;

    }

}



public class Funcionario2 {

    private String nome;
    private double salario;
    private Data2 dataEntrada;
    private String registro;

    //Getters and Setters 

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

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

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

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

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

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

    public String getRegistro(){
        return this.registro;
    }

    public void setRegistro(String registro){
        this.registro = registro;
    }


    public void recebeAumento(double valorAdicional){

        this.salario += valorAdicional;

    }

    public double calculaGanhoAnual() {

        return this.salario * 12;

    }

    public void mostra(){

        System.out.println("Nome do funcionario : " + this.getNome() + 
                            "\nSalario do funcionario : " + this.getSalario() +
                            "\nRegistro de funcionario : " + this.getRegistro() +
                            "\nGanho anual do funcionario : " + this.calculaGanhoAnual());
        System.out.println("Data de entrada  : " + this.dataEntrada.getFormatada()+"\n\n");
        //Metodo void mostra() mostra a data de entrada que foi formatada dentro do metodo String getFormatada()


    }        

}


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

        Funcionario2 registro_1 = new Funcionario2();

        registro_1.dataEntrada = new Data2();


        registro_1.setNome("Hugo");
        registro_1.setRegistro("6444296266");
        registro_1.setSalario(1100);
        registro_1.stDataEntrada.setPreencheData(8,9,2015);



            //System.out.println("O primeiro funcionario chamado "+registro_1.nome+" e contem o salario de R$ "+ registro_1.salario);

            /*registro_1.recebeAumento(500);

            System.out.println("\nHugo recebeu um aumento de R$ 500");
            */

        registro_1.mostra();



            Funcionario2 registro_2 = new Funcionario2();

            registro_2.dataEntrada = new Data2();

            registro_2.setNome("Thata");
            registro_2.setRegistro("123456789");
            registro_2.setSalario(700);
            registro_2.setDataEntrada.setPreencheData(13,7,1993);

        registro_2.mostra();

            /*Funcionario registro_3 = new Funcionario();

            registro_3 = registro_1;


             if (registro_1 == registro_3) {
                    System.out.println("iguais");
                } else {
                    System.out.println("diferentes");        
                }
            */    

    }

}

Na classe TesteFuncioario2, No eclipse a linha abaixo:

registro_1.dataEntrada = new Data2();

está gerando o seguinte erro:

The field Funcionario2.dataEntrada is not visible

e também a seguinte linha:

registro_1.setDataEntrada.setPreencheData(8,9,2015);

está gerando o seguinte erro:

setDataEntrada cannot be resolved or is not a field

Gostaria de entender porque a variável de instância dataEntrada da erro, e também não estou setando a data corretamente, não estou entendendo porque consegui setar os outros atributos e com a data deu errado. Li no forum os outros problemas com a data dos colegas, mas eu não consegui entender porque da erro na data.

Poderiam me ajudar a entender esse processo referente a data?

Obrigado.

5 respostas

Oi José,

Você precisava criar um objeto Data2 antes de atribuir para o setter de funcionario, veja o exemplo abaixo:

Funcionario funcionario1 = new Funcionario();

Data data = new Data();
data.setPreencheData(21, 7, 2015);

funcionario1.setNome("Hugo");
funcionario1.setRegistro("125125");
funcionario1.setSalario(1100);
funcionario1.setDataEntrada(data);

Douglas Galdino obrigado pela ajuda,

Fiz o que você sugeriu, e funcionou!

Mas o erro na minha variável de instância continuava, segue abaixo:

registro_1.dataEntrada = new Data2();

Então comentei essa linha para os dois funcionarios(registro_1 e registro_2), e notei que o erro sumiu e estaá funcionando normalmente, segue como está agora:

Funcionario2 registro_1 = new Funcionario2();

//registro_1.dataEntrada = new Data2(); Data2 data = new Data2();

data.setPreencheData(8, 9, 2015); registro_1.setNome("Hugo"); registro_1.setRegistro("6444296266"); registro_1.setSalario(1100); registro_1.setDataEntrada(data);

Porque não preciso da variável de instância dataEntrada?

Porque criar o objeto data2 antes de atribuir ao set? Não estou compriendendo.

solução!

Oi José,

O interessante é você manter todos atributos encapsulados, isso inclui a data, então se você criar um objeto e atribuir diretamente a variavel, quebra o encapsulamento, o setter resolve isso ou diretamente pelo construtor.

Você não precisa chamar o método setPreencheData de Data2, passar a data e então atribuir? Criando o objeto diretamente à variavel, você vai ficar sem a informação, faz sentido?

Outra quebra de encapsulamento, a lei de demeter, foi chamar o setPreencheData diretamente pela classe funcionario.

Nesse outro caso você poderia encapsular criando um método dentro de Funcionario2, por exemplo:

public void preencheData(int dia, int mes, int ano) {
    this.dataEntrada.setPreencheData(dia, mes, ano);
}

Obrigado pelo esclarecimento Douglas vlw