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

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

Alguem poderia me ajudar, quando testo minha classe Data digitando uma data invalida do tipo 31/02/2015 ela nao exibe a menssagem de data invalida!

public class Data {

int dia; int mes; int ano;

public void entradaFuncionario(int dia, int mes, int ano){ //Criando o metodo da data de entrada de um funcionario this.dia = dia; this.mes = mes; this.ano = ano; if (! validaData(dia, mes, ano)) { System.out.println("A data e " + getFormataData() + " invalida!"); } }

public boolean validaData(int dia, int mes, int ano){ int ultimoDia = 31; if(mes == 4 || mes == 6 || mes == 9 || mes == 11){ ultimoDia = 30;} else if (mes == 2){ if(ano % 4 == 0){ ultimoDia = 29; } else { ultimoDia = 28; } } if (dia > ultimoDia){ return false; } return true; }

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

}

}

public class Funcionario {

private String nome; private String rg; private String departamento; private double salario; protected Data dataEntrada; // Chamando a classe data e atribuindo uma variavel a ela

public void setNome(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 setDepartamento(String departamento){ this.departamento = departamento; }

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

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

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

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

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

public void mostra(){ System.out.println("Seu nome é : " + this.getNome()); if (this.rg == null){ System.out.println("Esse funcionario ainda não cadastrou sua indentidade!\n FAVOR CADASTRAR SEU RG"); }else{ System.out.println("Sua indentidade é : " + this.getRg()); } //System.out.println("Sua indentidade é : " + this.getRg()); if (this.departamento == null){ System.out.println("Esse funcionario nao possui departamento ainda!"); }else{ System.out.println("Seu departamento é : " + this.getDepartemento()); } //System.out.println("Seu departamento é : " + this.getDepartemento()); System.out.println("Voce ganha por mes : " + this.getSalario()); System.out.println("Voce ganhou durante o ano : " + this.getCalculaGanhoAnual()); System.out.println("Sua data de entrada na empresa foi em : " + this.dataEntrada.getFormataData()); //System.out.print("dia" + this.dataEntrada.dia); //System.out.print("\nmes" + this.dataEntrada.mes); //System.out.print("\nano" + this.dataEntrada.ano); }

}

public class TestaFuncionario {

public static void main(String[] args) {

Funcionario f1 = new Funcionario(); f1.setNome("Waldir escouto pereira"); f1.setRg("118977120"); f1.setSalario(2500.0); f1.setDepartamento("Desenvolvedor");

f1.dataEntrada = new Data(); // Criando uma data de entrada para o funcionario

f1.dataEntrada.entradaFuncionario(31, 02, 2015);

f1.mostra();

4 respostas

Olá Waldir, tudo bem?

Na sua classe TestaFuncionario.java, há o seguinte código:

public class TestaFuncionario {

    public static void main(String[] args) {

        Funcionario f1 = new Funcionario();
        f1.setNome("Waldir escouto pereira");
        f1.setRg("118977120");
        f1.setSalario(2500.0);
        f1.setDepartamento("Desenvolvedor");

        f1.dataEntrada = new Data(); // Criando uma data de entrada para o funcionario

        f1.dataEntrada.entradaFuncionario(31, 02, 2015);

        f1.mostra();
    }
}

Aqui você cria um funcionário referenciado por f1 e preenche os atributos deste(nome,rg,salario,departamento).

Depois, você cria uma instância da sua classe Data. Ou seja, você aloca um objeto em memória com valores default para dia, mês e ano(todos iguais a 0, visto que são atributos do tipo 'int').

Em seguida, você valida a data através do método entradaFuncionario. Este é um método da classe Data, certo? Na linha:

f1.dataEntrada.entradaFuncionario(31,02,2015);

Será impresso: "A data e 31/2/2015 invalida!". De fato acontece, rodei seu código e está imprimindo.

No entanto, na linha seguinte, você chama o método mostra() da classe Funcionario. A última linha do seu método mostra() é:

System.out.println("Sua data de entrada na empresa foi em : " + this.dataEntrada.getFormataData());

Ou seja, você exibe a data formatada, independente dela ser válida ou não.

Esta última linha, aproveitando seu código de validação, poderia ficar com esta cara:

int dia = this.dataEntrada.dia;
int mes = this.dataEntrada.mes;
int ano = this.dataEntrada.ano;
if( this.dataEntrada.validaData( dia,mes,ano ) ){
    System.out.println( this.dataEntrada.getFormataData() );
}
else{
    System.out.println( "Sua data de entrada na empresa foi em : " + this.dataEntrada.getFormataData() );
}

Acho que assim, não haveria a necessidade do método entradaFuncionario na classe Data.

O que acha?

Abs.

Ops, vacilei. O código que quis sugerir, no método mostra(), é este:

    int dia = this.dataEntrada.dia;
    int mes = this.dataEntrada.mes;
    int ano = this.dataEntrada.ano;
    if( this.dataEntrada.validaData( dia,mes,ano ) ){
        System.out.println( "Sua data de entrada na empresa foi em : " + this.dataEntrada.getFormataData() );
    }
    else{        
        System.out.println("A data: " +this.dataEntrada.getFormataData() + " é invalida!");
    }

Desculpe-me e abs!

Oi Bruno boa tarde, na realidade eu facilitei meu codigo e fiz um construtor que ja recebe o dia o mes e o ano pra ficar mais facil, ta tudo funcionando certinho o problema é que quando coloco pra rodar ele ja imprime e avisa se as datas sao validas ou nao e ficam todas juntas, fica confuso e estranho. Eu gostaria que a data fosse avaliada e mostrada junto com o nome de cada funcionario, e não estou conseguindo fazer isso, voce pode me ajudar? segue meu codigo.

public class Data {

int dia; int mes; int ano;

public Data(int dia, int mes, int ano) { this.dia = dia; this.mes = mes; this.ano = ano; if (!validaData(dia, mes, ano)) { System.out.println("A DATA " + getFormataData() + " NÃO É VALIDA!"); }else{ System.out.println("A DATA " + getFormataData() + " É VALIDA!"); } } public boolean validaData(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 % 4 == 0) { ultimoDiaDoMes = 29; } else { ultimoDiaDoMes = 28; } } if (dia > ultimoDiaDoMes) { return false; } return true; }

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

} }

public class TestaFuncionario {

public static void main(String[] args) {

Funcionario f1 = new Funcionario(); f1.setNome("Waldir escouto pereira"); f1.setRg("118977120"); f1.setSalario(2500.0); f1.setDepartamento("Desenvolvedor");

f1.dataEntrada = new Data(29,02,2021); // Criando uma data de entrada para o funcionario

f1.mostra(); }

public class Funcionario {

private String nome; private String rg; private String departamento; private double salario; protected Data dataEntrada; // Chamando a classe data e atribuindo uma variavel a ela

public void setNome(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 setDepartamento(String departamento){ this.departamento = departamento; }

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

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

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

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

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

public void mostra(){ System.out.println("Seu nome é : " + this.getNome()); if (this.rg == null){ System.out.println("Esse funcionario ainda não cadastrou sua indentidade!\n FAVOR CADASTRAR SEU RG"); }else{ System.out.println("Sua indentidade é : " + this.getRg()); } //System.out.println("Sua indentidade é : " + this.getRg()); if (this.departamento == null){ System.out.println("Esse funcionario nao possui departamento ainda!"); }else{ System.out.println("Seu departamento é : " + this.getDepartemento()); } //System.out.println("Seu departamento é : " + this.getDepartemento()); System.out.println("Voce ganha por mes : " + this.getSalario()); System.out.println("Voce ganhou durante o ano : " + this.getCalculaGanhoAnual()); } }

solução!

Olá Waldir, boa noite.

Segue sua classe Data:

class Data {

    int dia;
    int mes;
    int ano;

    public Data(int dia, int mes, int ano) {
    /*
        Aqui você atribui os argumentos aos atributos,
        independente de serem válidos ou não.
    */
    this.dia = dia;
    this.mes = mes;
    this.ano = ano;

    /*
        Aqui, você chama o método validaData(dia,mes,ano). Mas independente do valor do retorno, um objeto data será instanciado em memória, com valores corretos ou não!!! 
        O que está fazendo é apenas informar que a data está incorreta ou não, segundo sua lógica de validação. Acho que NÃO DEVERIA TER ESTE TESTE AQUI NO CONSTRUTOR.
        O que você acha de pegar esta lógica e transformá-la num método mostra() da classe Data? Vou sugerir abaixo!
    */
    if ( !validaData(dia, mes, ano) ){
        System.out.println("A DATA " + getFormataData() + " NÃO É VALIDA!");
    }
        else{
            System.out.println("A DATA " + getFormataData() + " É VALIDA!");
        }
    }

    public boolean validaData(int dia, int mes, int ano){
        /*
            Aqui você faz as devidas validações retornando true
            ou false. Blz!!
        */
    }

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

Caro Waldir, quando chamamos o construtor de um objeto através do operador new, ele CRIARÁ UM OBJETO EM MEMÓRIA(HEAP). Se o código compilar sem erros e se não houver nenhum(a) erro/exceção em tempo de execução, fatalmente o objeto será criado.

Você pode interromper o fluxo de execução do construtor com tratamento de exceções, que será apresentado neste curso mais a frente.

Por enquanto, eu tiraria a validação do construtor da Data e a colocaria no método mostra(). O que acha disto:

Uma sugestão para classe Data, abaixo:

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

    //Novo Construtor
    public Data(int dia, int mes, int ano) {
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }

    //Método mostra()
    public void mostra(){
        if( validaData(this.dia,this.mes,this.ano) ){
            System.out.println("A DATA " + getFormataData() + " É VALIDA!"); 
        }
        else{
            System.out.println("A DATA " + getFormataData() + " NÃO É VALIDA!");
        }
    }

    //demais métodos

}

Uma Sugestão para o método mostra da classe Funcionario, abaixo:

    public void mostra(){
        System.out.println("Seu nome é : " + this.getNome());
        //Aqui você imprime outros atributos....
        .....
        // Impressão da dataEntrada
        this.funcionario.dataEntrada.mostra();        
    }

Classe TestaFuncionario, abaixo:

class Funcionario{
    public static void main(String[] args){
        Funcionario f1 = new Funcionario();
        f1.setNome("Waldir escouto pereira");
        f1.setRg("118977120"); 
        f1.setSalario(2500.0);
        f1.setDepartamento("Desenvolvedor");
        f1.dataEntrada = new Data(29,02,2021); 
        f1.mostra();
    }
}

Espero ter contribuído de alguma forma. Caro Waldir, abraços e caso não esteja satisfeito, continue mandando as dúvidas para o fórum!!! Penso que ele foi feito pra isso :)