1
resposta

Multa por atraso

public class CalcularMulta {
    String livro;
    int diasDeAtraso;
    double valorDaMulta;

    public void multar() {
        valorDaMulta = diasDeAtraso * 2.5;
    }
    public void exibirDetalhes() {
        System.out.printf("Livro: " + livro + " | Multa por " + diasDeAtraso + " dias de atraso: R$ %.2f", valorDaMulta);
    }
}
public class Exercicios {
    public static void main(String[] args) {
        CalcularMulta c = new CalcularMulta();

        c.livro = "Dom Casmurro";
        c.diasDeAtraso = 3;
        c.multar();
        c.exibirDetalhes();
    }
}
1 resposta

Olá, Bernardo. Como vai?

O seu código está excelente e muito bem estruturado! Você aplicou perfeitamente os conceitos fundamentais da Orientação a Objetos em Java: criou a classe (CalcularMulta) com seus atributos, definiu um método para realizar a regra de negócio (multar()), outro para exibir os dados (exibirDetalhes()) e instanciou tudo corretamente dentro do método main.

Como o objetivo do curso é praticar e evoluir a estrutura do código, quero trazer algumas sugestões de boas práticas que deixarão o seu programa com um padrão ainda mais profissional e alinhado com o mercado Java.


1. Ajuste na concatenação do System.out.printf

No método exibirDetalhes, você utilizou o printf (que serve para formatar texto usando marcadores como %.2f), mas acabou concatenando as strings com o operador +. Quando misturamos concatenação comum com printf, perdemos parte da elegância e do propósito do método.

Podemos deixar a sintaxe mais limpa substituindo as concatenações por marcadores de texto (%s para Strings e %d para números inteiros):

public void exibirDetalhes() {
    // Usando os marcadores %s e %d limpamos a sintaxe do printf
    System.out.printf("Livro: %s | Multa por %d dias de atraso: R$ %.2f%n", livro, diasDeAtraso, valorDaMulta);
}
  • Note o %n no final: ele serve para pular uma linha no console de forma compatível com qualquer sistema operacional.

2. Sugestão de evolução: Encapsulamento

Abaixo, apresento uma evolução do seu código aplicando o Encapsulamento (um dos pilares da Orientação a Objetos). A boa prática diz que os atributos de uma classe não devem ser expostos diretamente (c.livro = ...). Em vez disso, nós os tornamos privados (private) e usamos métodos Getters e Setters, além de um Construtor para inicializar o objeto.

Veja como o seu código ficaria em um nível avançado:

public class CalcularMulta {
    private String livro;
    private int diasDeAtraso;
    private double valorDaMulta;

    // Construtor para garantir que o objeto nasça com os dados necessários
    public CalcularMulta(String livro, int diasDeAtraso) {
        this.livro = livro;
        this.diasDeAtraso = diasDeAtraso;
        this.multar(); // Calcula a multa automaticamente na criação
    }

    // Método privado, pois o cálculo é uma responsabilidade interna da classe
    private void multar() {
        this.valorDaMulta = this.diasDeAtraso * 2.5;
    }

    public void exibirDetalhes() {
        System.out.printf("Livro: %s | Multa por %d dias de atraso: R$ %.2f%n", 
                this.livro, this.diasDeAtraso, this.valorDaMulta);
    }
}

E para instanciar no main, o seu código ficaria muito mais enxuto e seguro:

public class Exercicios {
    public static void main(String[] args) {
        // Criando o objeto e passando os dados direto no construtor
        CalcularMulta c = new CalcularMulta("Dom Casmurro", 3);
        c.exibirDetalhes();
    }
}

Parabéns pela resolução da atividade! O raciocínio lógico está afiado e o código atual funciona perfeitamente para o que foi proposto. Continue praticando!

Espero que possa ter lhe ajudado!