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!