Olá pessoal, gostaria de compartilhar meu projeto desenvolvido durante o curso de Java com Orientação a Objetos. Neste desafio coloquei em prática os conceitos de implementações de interfaces, ordenação de listas e entre outras dicas demonstradas no curso.
package br.com.alura.desafioAppCompras.modelos;
public class Produto {
    private String descricao;
    private double valor;
    public Produto(String descricao, double valor) {
        this.descricao = descricao;
        this.valor = valor;
    }
    public String getDescricao() {
        return descricao;
    }
    public double getValor() {
        return valor;
    }
}
package br.com.alura.desafioAppCompras.modelos;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ContaBancaria {
    private double saldo;
    private List<Produto> compras = new ArrayList<>();
    public ContaBancaria(double saldo) {
        this.saldo = saldo;
    }
    public void realizaCompra(String descricao, double valor){
        if (this.saldo >= valor) {
            Produto produto = new Produto(descricao, valor);
            this.compras.add(produto);
            saldo -= valor;
            System.out.println("Compra realizada!");
        } else {
            System.out.println("Saldo insuficiente!");
        }
    }
    public void exibeCompras(){
        System.out.println("""
                ***************************************
                COMPRAS REALIZADAS:\n
                """);
        //Ordenando a lista com base no preco dos produtos.
        Collections.sort(compras, new ComparadorDePreco());
        for (Produto produto : compras) {
            System.out.println(produto.getDescricao() + ": R$" + produto.getValor());
        }
        System.out.println("\nSaldo: R$" + this.saldo);
        System.out.println("\n***************************************");
    }
    public double getSaldo() {
        return saldo;
    }
}
package br.com.alura.desafioAppCompras.modelos;
import java.util.Comparator;
public class ComparadorDePreco implements Comparator<Produto> {
    @Override
    public int compare(Produto produto1, Produto produto2) {
        return Double.compare(produto1.getValor(), produto2.getValor());
    }
}
package br.com.alura.desafioAppCompras.principal;
import br.com.alura.desafioAppCompras.modelos.ContaBancaria;
import java.util.Scanner;
public class Principal {
    public static void main(String[] args) {
        //Declaração de variáveis.
        boolean aplicacaoRodando = true;
        int opcaoDoMenu;
        double limite, valor;
        String nomeProduto;
        Scanner leitor = new Scanner(System.in);
        //Inicializando conta.
        System.out.println("Digite o limite do cartão de crédito para iniciar: ");
        do {
            limite = leitor.nextDouble();
            if (limite <= 0) {
                System.out.println("Digite um valor positivo!");
            }
        } while (limite <= 0);
        ContaBancaria conta = new ContaBancaria(limite);
        //Menu de opções.
        while (aplicacaoRodando){
            System.out.println("""
                    \nMenu de Opções
                    1- Realizar compra
                    2- Consultar extrato
                    3- Sair\n
                    """);
            opcaoDoMenu = leitor.nextInt();
            switch (opcaoDoMenu){
                case 1:
                    System.out.println("Digite a descrição do produto: ");
                    nomeProduto = leitor.next();
                    System.out.println("Digite o valor do produto: ");
                    do {
                        valor = leitor.nextDouble();
                        if (valor <= 0) {
                            System.out.println("Digite um valor positivo!");
                        }
                    } while (valor <= 0);
                    conta.realizaCompra(nomeProduto, valor);
                    break;
                case 2:
                    conta.exibeCompras();
                    break;
                case 3:
                    aplicacaoRodando = false;
                    break;
                default:
                    System.out.println("Opção inválida!");
                    break;
            }
        }
    }
}
Aqui estão todas as classes do meu projeto.
Este é um exemplo do resultado em console:
 
  
 
            