Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Multa por atraso

Segue minha resolução! Acho que está um pouco diferente do solicitado, mas funciona bem.

  • Classe Pedido que contém as informações relacionadas ao livro alugado:
package br.com.exercicios.alura;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Pedido {

    String livro;
    LocalDate dataRetirada;
    LocalDate dataEntrega;
    Long diasAtraso;
    double multaAtraso;


    public static final DateTimeFormatter FORMATTER =
            DateTimeFormatter.ofPattern("dd/MM/yyyy");

    public String getLivro() {
        return livro;
    }

    public void setLivro(String livro) {
        this.livro = livro;
    }

    public String getDataRetirada() {
        return dataRetirada.format(FORMATTER);
    }

    public void setDataRetirada(LocalDate dataRetirada) {
        this.dataRetirada = dataRetirada;
    }

    public String getDataEntrega() {
        return dataEntrega.format(FORMATTER);
    }

    public void setDataEntrega(LocalDate dataEntrega) {
        if (dataEntrega.isBefore(this.dataRetirada)){
            throw new IllegalArgumentException("Data de entrega não pode ser anterior a data de retirada!");

        }
        this.dataEntrega = dataEntrega;
    }

    public Long getDiasAtraso() {
        return diasAtraso;
    }

    public void setDiasAtraso(Long diasAtraso) {
        this.diasAtraso = diasAtraso;
    }

    public String getValorFormatado() {
        NumberFormat nf = NumberFormat.getInstance(new Locale("pt", "BR"));
        nf.setMinimumFractionDigits(2);
        nf.setMaximumFractionDigits(2);

        return nf.format(multaAtraso);

    }



        @Override
        public String toString () {
            return "livro: " + livro + "|" +
                    "Data da retirada: " + dataRetirada.format(FORMATTER) +
                    "| data da entrega: " + dataEntrega.format(FORMATTER) +
                    "| dias em atraso: " + diasAtraso +
                    "| Multa por atraso: R$ " + getValorFormatado();
        }

}
  • Main para rodar a aplicação:
package br.com.exercicios.alura;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Scanner;

public class Main {
    public static final long PRAZO_DEVOLUCAO = 7;
    public static final DateTimeFormatter FORMATTER =
            DateTimeFormatter.ofPattern("dd/MM/yyyy");
    public static final double MULTA = 2.50;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Pedido livro =new Pedido();
        livro.livro = "Dom Casmurro";
        livro.dataRetirada = LocalDate.parse("22/03/2026", FORMATTER);
        while (true){
            System.out.println("Digite a data de devolução: ");
            livro.dataEntrega = LocalDate.parse(sc.next(), FORMATTER);
            if(!livro.dataEntrega.isBefore(livro.dataRetirada)){
                break;
            } else {
                System.out.println("Data de entrega não pode ser anterior a data de retirada.");
            }
            livro.getDataEntrega();
        }

        long diasAluguel = ChronoUnit.DAYS.between(livro.dataRetirada, livro.dataEntrega);
        if(diasAluguel > PRAZO_DEVOLUCAO){
            livro.diasAtraso  = diasAluguel - PRAZO_DEVOLUCAO;
            livro.multaAtraso = MULTA * livro.diasAtraso;
            System.out.println(livro);
        } else {
            System.out.printf("Entrega em dia!\n" + livro);
        }

    }
}
1 resposta
solução!

Olá, Victor, como vai?

Seu exercício apresenta uma ótima evolução ao utilizar classes da API de datas do Java, como o LocalDate e o ChronoUnit, para tornar o sistema de livraria mais realista. Você conseguiu aplicar conceitos de encapsulamento com getters e setters, além de tratar a formatação de moeda com o NumberFormat, o que demonstra uma excelente preocupação com a experiência de uso do programa. A lógica para validar se a data de entrega é anterior à de retirada protege a integridade dos dados e o uso de constantes para o valor da multa e o prazo de devolução facilita futuras manutenções no código.

Como ponto de melhoria para o seu desenvolvimento, note que a lógica de cálculo da multa e dos dias de atraso foi colocada na classe Main, mas, seguindo os princípios da Orientação a Objetos, esses comportamentos poderiam pertencer à classe Pedido. Ao mover o cálculo para dentro da classe Pedido, você garante que o objeto seja responsável por suas próprias regras de negócio, o que chamamos de coesão. Uma dica é criar um método calcularMulta dentro de Pedido que utilize os atributos já existentes na classe para definir o valor da variável multaAtraso.

Parabéns pelo empenho em ir além do que foi solicitado no exercício inicial e continue compartilhando seu progresso conosco. O fórum está à disposição.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!