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

Dúvida no Ex. 3 da Aula 6 - Construtores

Estou com dificuldades em implementar a validação de data no meu código. Tentei de varias maneiras mas não sei como passar os parâmetros de forma correta. Alguém poderia me ajudar?

TestaEmpresa.java:4: error: constructor Data in class Data cannot be applied to given types; private Data dataDaEntrada = new Data(); ^ required: int,int,int found: no arguments reason: actual and formal argument lists differ in length 1 error

Segue minhas classes:

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

    public Funcionario () {
    }

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


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

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

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

    public void preencheDataDaEntrada(int dia,int mes, int ano) {
        this.dataDaEntrada.imprimeData(dia, mes, ano);
    }

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

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

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

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

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

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


    public void mostra() {

        System.out.println("");
        System.out.println("Nome: " + getNome());
        System.out.println("RG: " + getRg());
        System.out.println("Departamento: " + getDepartamento());
        System.out.println("Salário R$: " + getSalario());
        System.out.println("Ganho Anual: " + getGanhoAnual());
        System.out.println("Data de entrada: " + this.dataDaEntrada.getFormatada());

    }
}

class Empresa {

    private String nome;
    private String cnpj;
    private String endereco;
    private Funcionario[] empregados;
    int count = 0;


    public Empresa (int tamanhoDoArray){
        this.empregados = 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 setEndereco (String endereco) {
        this.endereco = endereco;
    }

    public String getEndereco () {
        return this.endereco;
    }

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

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

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


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

class Data {

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

    public void imprimeData (int dia, int mes, int ano){

        this.dia = dia;
        this.mes = mes;
        this.ano = ano;

        }


        public Data(int dia, int mes, int ano) {
                this.dia = dia;
                this.mes = mes;
                this.ano = ano;
                if (! dataViavel(dia, mes, ano)) {
                    System.out.println("A data " + getFormatada() + " não é válida!");
                }
            }
            private boolean dataViavel(int dia, int mes, int ano) {
                if (dia <= 0 || mes <= 0) {
                    return false;
                }
                int ultimoDiaDoMes = 31; // por padrao são 31 dias
                if (mes == 4 || mes == 6 || mes == 9 || mes == 11 ) {
                    ultimoDiaDoMes = 30;
                } else if (mes == 2) {
                    if ((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))) {
                        ultimoDiaDoMes = 29;
                    } else {
                        ultimoDiaDoMes = 28;
                    }
                }
                if (dia > ultimoDiaDoMes) {
                    return false;
                }
                return true;
            }


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

    }

}


public class TestaEmpresa {

    public static void main (String [] args) {

        Empresa empresa = new Empresa(10);

        Funcionario f = new Funcionario("Vitor");
        f.setRg ("25.889.335-2");
        f.setDepartamento ("RH");
        f.setSalario (1000);
        f.preencheDataDaEntrada (29,2,2016);
            empresa.adiciona (f);

        Funcionario f1 = new Funcionario("Carlos Augusto dos Santos");
        f1.setRg ("478.886.345-7");
        f1.setDepartamento ("SME");
        f1.setSalario (3000);
        f1.preencheDataDaEntrada (29,2,1900);
        empresa.adiciona(f1);

        Funcionario f2 = new Funcionario ("Rodrigo Cordeiro");
        f2.setRg ("38.463.551-1");
        f2.setDepartamento ("Diretoria");
        f2.setSalario (10000);
        f2.preencheDataDaEntrada (31,11,1998);
        empresa.adiciona(f2);


        empresa.getFuncionario(0).mostra();

        empresa.getFuncionario(1).mostra();

        empresa.getFuncionario(2).mostra();        


    }
}
4 respostas

Olá Diego, observe que você implementou um construtor na classe Data, com parâmetros:

 public Data(int dia, int mes, int ano) {
                this.dia = dia;
                this.mes = mes;
                this.ano = ano;
                if (! dataViavel(dia, mes, ano)) {
                    System.out.println("A data " + getFormatada() + " não é válida!");
                }
}

Mas não implemento o construtor default:

public Data(){

}

A classe Funcionario tenta utilizar esse construtor default em private Data dataDaEntrada = new Data(); e por isso ocorre o erro.

Quando não há nenhum construtor numa classe, por default o Java entende que ele é vazio, mas quando você implementa esse construtor com algum parâmetro esse construtor defaultdeixa de existir, você precisa implementá-lo. Entendeu?

Olá Eduardo, tudo bom? Então é exatamente este o X da questão. No meu código se na classe data eu implementar um construtor default "public Data () {}" realmente meu código irá funcionar porém, a validação de data de nada servirá. Por que na hora que classe é criada sem parâmetros, ela vai usar automaticamente o construtor default e não o construtor com os métodos de validação de data que eu criei. A minha dúvida é como passar os parâmetros corretamente nesta linha, private Data dataDaEntrada = new Data(); para que não de erro na hora da compilação e para que meu programa use corretamente os métodos de validação de data do meu construtor, entendeu?

solução!

Olá Diego, boa noite. Vamos tentar outra abordagem então.

Invés de Funcionario ter private Data dataDaEntrada = new Data() deixe apenas private Data dataDaEntrada; e vamos também modificar o método :

public void preencheDataDaEntrada(Data data) {
        this.dataDaEntrada = data;
}

Perceba que passou a ser um setter "disfarçado".

E lá no TestaEmpresa você vai usar f.preencheDataDaEntrada (new Data(29,2,2016));.

Qualquer coisa, é só avisar.

Valeu Eduardo!!! Muito obrigado pela ajuda, está tudo funcionando direitinho.