Fiz apenas uma refatoração no código do instrutor no exercício "Relatório do Produto", porque ele estava infringindo alguns conceitos que aprendi, como o de encapsulamento. Ele estava acessando diretamente os atributos da classe Product
, e isso é um erro. O mais sensato a se fazer é criar métodos para isso, como os getters e setters. E, para evitar que qualquer pessoa tenha acesso direto a métodos como setPrice()
e setQuantity()
, pode-se torná-los private, permitindo que apenas métodos internos os utilizem. Os valores dos produtos podem ser passados diretamente pelo construtor, no momento em que for instanciado um novo objeto Product, como no código abaixo:
Instructor Code:
Class Produto
public class Produto {
String nome;
double preco;
int quantidade;
void exibirInformacoes() {
System.out.println("Produto: " + nome);
System.out.printf("Preço: R$ %.2f\n", preco);
System.out.println("Quantidade em estoque: " + quantidade);
}
public static void main(String[] args) {
Produto p = new Produto();
p.nome = "Mouse Gamer";
p.preco = 159.9;
p.quantidade = 25;
p.exibirInformacoes();
}
}
Meu codigo:
Class Product
package com.github.rickmvi.product;
import lombok.AccessLevel;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
@lombok.AllArgsConstructor(access = lombok.AccessLevel.PUBLIC)
@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.Setter(value = AccessLevel.PRIVATE)
@lombok.ToString(of = {"name", "price", "quantity"})
public class Product {
private String name;
private double price;
private int quantity;
public void displayInformations() {
DecimalFormat formatter = new DecimalFormat("R$#,##0.00");
System.out.printf("Name: %s, Price: %s, Quantity: %d%n", name, formatter.format(price), quantity);
}
/**
* Exibe as informações do produto formatando o preço conforme a moeda especificada.
*
* @param currency "BRL" para Real ou "USD" para Dólar.
*/
public void displayInformationsFormatted(String currency) {
NumberFormat formatter;
if ("US$".equalsIgnoreCase(currency))
formatter = NumberFormat.getCurrencyInstance(Locale.US);
else
formatter = NumberFormat.getCurrencyInstance(Locale.of("pt", "BR"));
System.out.printf("Name: %s, Price: %s, Quantity: %d%n", name, formatter.format(price), quantity);
}
}
Class Main
package com.github.rickmvi;
import com.github.rickmvi.product.Product;
public class Main {
public static void main(String[] args) {
Product product = new Product("Mouse Gamer", 159.9, 25);
product.displayInformations();
}
}
Output: