Voltar para a lista

Exercício 2 — Agregação (Java)

Resolução: Classe Produto.java e Pedido.java

🧩 Exercício 2 — Agregação

Tema: Sistema de pedidos e produtos

Objetivo: Implementar a relação de agregação entre classes independentes.

Enunciado:
Implemente as classes Produto e Pedido para representar um relacionamento de agregação, no qual um pedido agrega vários produtos. Cada produto possui nome e preço, e pode existir independentemente de um pedido (ex.: catálogo). O pedido mantém uma lista de produtos e deve ser capaz de calcular o valor total.

O programa principal, responsável por cadastrar produtos, criar pedidos e calcular totais, está incluído nesta página para fins de teste. Sua tarefa central é modelar corretamente a agregação, garantindo que a exclusão de um pedido não afete a existência dos produtos.

💻 Código Java

Exibindo apenas o programa principal (Main.java). Para ver tudo: ?codigo=123abcqwe.

//App.java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class App {
    private static final Scanner sc = new Scanner(System.in);
    private static final List<Produto> catalogo = new ArrayList<>();
    private static final List<Pedido> pedidos = new ArrayList<>();
    private static int sequenciaPedidos = 1;

    public static void main(String[] args) {
        int op;
        do {
            menu();
            op = lerInt("Escolha uma opção: ");
            switch (op) {
                case 1 -> cadastrarProduto();
                case 2 -> listarCatalogo();
                case 3 -> criarPedido();
                case 4 -> adicionarProdutoEmPedido();
                case 5 -> listarPedidos();
                case 6 -> verTotalDeUmPedido();
                case 0 -> System.out.println("Encerrando...");
                default -> System.out.println("Opção inválida!");
            }
            System.out.println();
        } while (op != 0);
    }

    private static void menu() {
        System.out.println("=== Sistema de Pedidos (AGREGAÇÃO) ===");
        System.out.println("1) Cadastrar produto no catálogo");
        System.out.println("2) Listar catálogo");
        System.out.println("3) Criar novo pedido");
        System.out.println("4) Adicionar produto a um pedido");
        System.out.println("5) Listar pedidos e itens");
        System.out.println("6) Ver total de um pedido");
        System.out.println("0) Sair");
    }

    private static String lerStr(String msg) {
        System.out.print(msg);
        return sc.nextLine().trim();
    }

    private static int lerInt(String msg) {
        while (true) {
            try {
                System.out.print(msg);
                String s = sc.nextLine().trim();
                return Integer.parseInt(s);
            } catch (NumberFormatException e) {
                System.out.println("Digite um número inteiro válido.");
            }
        }
    }

    private static double lerDouble(String msg) {
        while (true) {
            try {
                System.out.print(msg);
                String s = sc.nextLine().trim().replace(",", ".");
                return Double.parseDouble(s);
            } catch (NumberFormatException e) {
                System.out.println("Digite um número (ex.: 10.50).");
            }
        }
    }

    // ===== Operações =====
    private static void cadastrarProduto() {
        System.out.println("--- Cadastrar Produto ---");
        String nome = lerStr("Nome: ");
        double preco = lerDouble("Preço (R$): ");
        try {
            Produto p = new Produto(nome, preco);
            catalogo.add(p);
            System.out.println("Produto cadastrado: " + p.getNome());
        } catch (IllegalArgumentException ex) {
            System.out.println("Falha ao cadastrar: " + ex.getMessage());
        }
    }

    private static void listarCatalogo() {
        System.out.println("--- Catálogo ---");
        if (catalogo.isEmpty()) {
            System.out.println("(vazio)");
            return;
        }
        int i = 0;
        for (Produto p: catalogo) {
            System.out.print(i + ") ");
            p.exibeProduto();
            i++;
        }
    }

    private static void criarPedido() {
        Pedido p = new Pedido(sequenciaPedidos++);
        pedidos.add(p);
        System.out.println("Pedido criado: #" + p.getNumero());
    }

    private static void adicionarProdutoEmPedido() {
        if (catalogo.isEmpty()) {
            System.out.println("Cadastre ao menos um produto no catálogo primeiro.");
            return;
        }
        if (pedidos.isEmpty()) {
            System.out.println("Crie ao menos um pedido primeiro.");
            return;
        }
        listarCatalogo();
        int idxProd = lerInt("Índice do produto no catálogo: ");
        if (idxProd < 0 || idxProd >= catalogo.size()) {
            System.out.println("Índice de produto inválido.");
            return;
        }

        listarPedidosSimples();
        int numPedido = lerInt("Número do pedido: ");
        Pedido alvo = encontrarPedidoPorNumero(numPedido);
        if (alvo == null) {
            System.out.println("Pedido não encontrado.");
            return;
        }

        Produto escolhido = catalogo.get(idxProd);
        alvo.adicionarProduto(escolhido);
        System.out.println("Adicionado: " + escolhido + " ao Pedido #" + alvo.getNumero());
    }

    private static void listarPedidosSimples() {
        System.out.println("--- Pedidos ---");
        if (pedidos.isEmpty()) {
            System.out.println("(vazio)");
            return;
        }
        for (Pedido p : pedidos) {
            System.out.println("Pedido #" + p.getNumero() + " (itens=" + p.getItens().size() + ")");
        }
    }

    private static void listarPedidos() {
        System.out.println("--- Detalhes dos Pedidos ---");
        if (pedidos.isEmpty()) {
            System.out.println("(vazio)");
            return;
        }
        for (Pedido p : pedidos) {
            p.exibePedido();
        }
    }

    private static void verTotalDeUmPedido() {
        if (pedidos.isEmpty()) {
            System.out.println("Nenhum pedido criado.");
            return;
        }
        listarPedidosSimples();
        int num = lerInt("Número do pedido: ");
        Pedido p = encontrarPedidoPorNumero(num);
        if (p == null) {
            System.out.println("Pedido não encontrado.");
            return;
        }
        System.out.printf("Total do Pedido " + p.getNumero() + " R$ " + p.calcularTotal() + " %n");
    }

    private static Pedido encontrarPedidoPorNumero(int num) {
        for (Pedido p : pedidos) if (p.getNumero() == num) return p;
        return null;
    }
}

▶️ Como testar

  1. Salve os arquivos Produto.java, Pedido.java e App.java na mesma pasta. Se tudo estiver ok pelo VS Code (sem marcações de erro), executar o programa para testar.
  2. No menu interativo, cadastre produtos no catálogo, crie pedidos e adicione itens aos pedidos.
  3. Observe que os produtos continuam existindo mesmo que um pedido seja descartado — característica da agregação.

🧾 Exemplo de Execução

Abaixo está um exemplo de saída no terminal ao executar o programa principal do Exercício 2 — Agregação:


=== Sistema de Pedidos (AGREGAÇÃO) ===
1) Cadastrar produto no catálogo
2) Listar catálogo
3) Criar novo pedido
4) Adicionar produto a um pedido
5) Listar pedidos e itens
6) Ver total de um pedido
0) Sair
Escolha uma opção: 1
--- Cadastrar Produto ---
Nome: Camiseta Branca
Preço (R$): 59.90
Produto cadastrado: Produto{nome='Camiseta Branca', preco=59.90}

Escolha uma opção: 1
--- Cadastrar Produto ---
Nome: Tênis Esportivo
Preço (R$): 249.90
Produto cadastrado: Produto{nome='Tênis Esportivo', preco=249.90}

Escolha uma opção: 3
Pedido criado: #1

Escolha uma opção: 4
--- Catálogo ---
0 -> Produto{nome='Camiseta Branca', preco=59.90}
1 -> Produto{nome='Tênis Esportivo', preco=249.90}
Índice do produto no catálogo: 0
--- Pedidos ---
Pedido #1 (itens=0)
Número do pedido: 1
Adicionado: Produto{nome='Camiseta Branca', preco=59.90} ao Pedido #1

Escolha uma opção: 4
--- Catálogo ---
0 -> Produto{nome='Camiseta Branca', preco=59.90}
1 -> Produto{nome='Tênis Esportivo', preco=249.90}
Índice do produto no catálogo: 1
--- Pedidos ---
Pedido #1 (itens=1)
Número do pedido: 1
Adicionado: Produto{nome='Tênis Esportivo', preco=249.90} ao Pedido #1

Escolha uma opção: 5
--- Detalhes dos Pedidos ---
Pedido #1 [itens=2, total=R$ 309.80]
  0 -> Produto{nome='Camiseta Branca', preco=59.90}
  1 -> Produto{nome='Tênis Esportivo', preco=249.90}

Escolha uma opção: 6
--- Pedidos ---
Pedido #1 (itens=2)
Número do pedido: 1
Total do Pedido #1: R$ 309.80

Escolha uma opção: 0
Encerrando...
  

💡 Observação: Note que os produtos continuam existindo no catálogo mesmo após o encerramento do pedido. Isso caracteriza uma relação de agregação, em que o objeto agregado (Produto) pode existir independentemente do objeto agregador (Pedido).