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

Dúvida no Ex. 60 da Aula 2 - Gerando conteúdo eficientemente

Nao estou conseguindo fazer imprimir a data nesse exercício...

Seguem as Classes...

Classe Gastos:

import br.com.caelum.empresa.modelo.Funcionario;

public class Gasto {
    private double valor;
    private String tipo;
    private Funcionario funcionario;
    private Calendar data;
    private boolean pagoEmDinheiro;

    public Gasto(double valor, String tipo, Funcionario funcionario, Calendar data, boolean pagoEmDinheiro) {
        super();
        this.valor = valor;
        this.tipo = tipo;
        this.funcionario = funcionario;
        this.data = data;
        this.pagoEmDinheiro = pagoEmDinheiro;
    }

    public boolean isPagoEmDinheiro() {
        return pagoEmDinheiro;
    }

    public void setPagoEmDinheiro(boolean pagoEmDinheiro) {
        this.pagoEmDinheiro = pagoEmDinheiro;
    }

    public double getValor() {
        return valor;
    }

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

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public Funcionario getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionario = funcionario;
    }

    public Calendar getData() {
        return data;
    }

    public void setData(Calendar data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return funcionario + "\n"+"Valor do Gasto: " + valor + ", Tipo da Despesa: "+tipo + ", Data do Despesa: "+data.getInstance();
    }
}


Classe TesteGastos:

package br.com.caelum.controle.modelo;

import java.util.Calendar;
import java.util.GregorianCalendar;

import br.com.caelum.empresa.modelo.Funcionario;

public class TesteGastos {
    public static void main(String[] args) {
        Calendar dataGasto = Calendar.getInstance();
        Calendar dataNascimento = new GregorianCalendar(1975, 7, 15);
        Funcionario func1 = new Funcionario("Aldo", 002, dataNascimento);
        Gasto gasto1 = new Gasto(50, "Taxi", func1, dataGasto, true);

        System.out.println(gasto1);
    }
}
3 respostas

Olá Aldo! Você não consegue imprimir a data pelo seguinte motivo:

A data salva como atributo do seu objeto Gasto é também um Objeto, então quando você utiliza o System.out.println() automaticamente é chamado o toString desse objeto e o toString de um objeto Calendar devolve várias informações referente ao calendário e a data, não somente aquela data que estamos acostumados (dd-mm-yyyy). Perceba também que seu Objeto é um calendário e não uma data.

Veja que o método toString, na sua declaração, retorna uma String:

@Override
    public String toString() {
       ...
    }
}

Então quando você sobrescreveu o método toString em sua classe e pós ele para retornar o atributo data como uma String, automaticamente foi chamado o método toString da classe Calendar que retorna uma String referente a todas as informações do calendário.

Um outro pequeno erro que você cometeu foi ao invés de por o atributo data para retornar como String, você pós data.getInstance() ou seja, você está retornando uma nova instancia e não a instancia criada quando você criou o objeto:

Calendar dataGasto = Calendar.getInstance();

Enfim, para mostrar a data como você deseja, você precisa transformar esse calendário em uma data e se for de sua preferencia formatar a exibição dessa data de acordo com seu gosto. Vamos lá então?

O que precisamos fazer é transformar seu calendário em uma data para imprimi-lo. Mas onde vamos fazer isso? Temos que fazer essa transformação no método que é chamado pra imprimir a data, ou seja, o toString da sua classe Gasto, pois é ele que é chamado quando você usa o System.out.println(gasto1) Veja os seu código do toString abaixo:

@Override
    public String toString() {
        return funcionario + "\n"+"Valor do Gasto: " + valor + ", Tipo da Despesa: "+tipo + ", Data do Despesa: "+data.getInstance();
    }

Para transformarmos um objeto da classe Calendar em uma data, ou seja em um Objeto da classe Date, usamos o método getTime(). Esse método nos retorna um objeto Date a a partir de um Calendar.

Assim poderíamos apenas substituir o data.getInstance() (que vale lembrar que esse getInstance() está errado) por data.getTime()

No entanto, se você fizer isso e rodar o código, você verá que ira aparecer mais ou menos algo parecido com isso :

Wed Aug 19 22:37:24 BRT 2015

Creio que não é isso que você deseja. Acho que o que você deseja é que aparecesse a data mesmo, seguindo o exemplo seria 19/08/2015.

Então, para isso temos que criar um formatador de datas e esse formatador já exite em java e é um objeto pertencente a classe SimpleDateFormat. Assim, vamos criar nosso formatador. Para isso, usamos o construtor dessa classe que recebe como parâmetro uma String que é o formato como você quer exibir sua data. No meu caso eu escolhi o seguinte format: dd/MM/yyyy. Ficando da seguinte forma:

SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");

Agora basta usarmos nosso formatador para formatar nossa data. Para isso, utilizamos o método format() de nosso formatador e então botamos essa data formatada para ser impressa. Coloquei abaixo duas formas de como o código final pode ficar:

FORMA 1:

@Override
    public String toString() {
        Date time = data.getTime();
        SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
        String dataFormatada = formatador.format(time);
        return funcionario + "\n"+"Valor do Gasto: " + valor + ", Tipo da Despesa: "+tipo + ", Data do Despesa: "+ dataFormatada;
    }

FORMA 2:

@Override
    public String toString() {
        SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
        return funcionario + "\n"+"Valor do Gasto: " + valor + ", Tipo da Despesa: "+tipo + ", Data do Despesa: "+ formatador.format(data.getTime());
    }

Bom, então é isso. Espero que eu tenha ajudado. Bons Estudos!

Grande Romário,

obrigado pela excelente explicação, agora eu entendi não somente o porque de estar errando, mas também aprendi como não errar mais nesse quesito.

Obrigado mais uma vez.

solução!

Que bom Aldo! Agradeço o elogio e continue sempre se esforçando. Apenas se lembre de fechar o tópico ok? Qualquer dúvida estamos aqui para ajudar. Bons Estudos!

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