Fiz o desafio um pouco às pressas, pois precisei sair para um compromisso. Por isso, talvez ele não esteja 100% fiel ao que foi proposto. Ainda assim, decidi entregar para receber feedback sobre o que pode ser melhorado ou se os requisitos foram atendidos corretamente.
Para quem quiser ver melhor, o publiquei no meu github.
Class Main:
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        MasterCard masterCard = new MasterCard();
        Requests requests = new Requests();
        int option;
        System.out.println("Enter credit limit: ");
        masterCard.setCredit(Optional.of(sc.nextDouble()));
        sc.nextLine();
        do {
            System.out.println("Enter products name: ");
            String name = sc.nextLine();
            System.out.println("Enter product value: ");
            double value = sc.nextDouble();
            if (value < 0 || value > masterCard.get().orElse(0.0)) return;
            insertProduct(name, value, requests, masterCard);
            do {
                System.out.println("Enter 0 for 'exit' or 1 for 'continue'");
                option = sc.nextInt();
            } while (option != 0 && option != 1);
            verify(option, sc, requests, masterCard);
        } while (option == 1 && requests.value() < masterCard.getCredit().get());
        sc.close();
    }
    @Contract(pure = true)
    private static void insertProduct(String name, double value, @NotNull Requests requests, @NotNull MasterCard masterCard) {
        Products product = new Products();
        product.insertName(name);
        product.insertValue(value);
        requests.getRequests().add(product);
        masterCard.decrementCredit(value);
        System.out.println("Purchase!");
    }
    @Contract(pure = true)
    private static void verify(int i, Scanner sc, Requests requests, MasterCard masterCard) {
        if (i == 1)
            sc.nextLine();
        else {
            Collections.sort(requests.getRequests());
            System.out.println("""
                        **********@*@**********
                        Purchase made successfully!
                        """);
            for (Products product : requests.getRequests()) {
                System.out.println(product.name() + ": R$" + String.format("%.2f", product.value()));
            }
            masterCard.get().ifPresent(s -> System.out.println("\nBalance of the Card: " + s));
            System.out.println("""
                        
                        **********@*@**********
                        """);
        }
    }
}
Class MasterCard & Credit:
/**
 * The {@code Card} class extends the {@code Credit} class, inheriting its functionalities
 * for managing a credit system. This class represents a specific type of credit entity
 * which can be used to associate and manage purchasing operations involving products.
 *
 * <p>The {@code Card} class leverages all features defined in the parent {@code Credit} class,
 * such as setting a credit limit, decrementing credit, and retrieving the current credit value.
 */
public class MasterCard extends Credit {
}
@lombok.ToString
@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.NoArgsConstructor(access = lombok.AccessLevel.PUBLIC)
public class Credit {
    private Optional<Double> credit;
    public void setCredit(@NotNull Optional<Double> credit) {
        if (credit.isEmpty()) return;
        this.credit = credit;
    }
    public void decrementCredit(double decrement) {
        if (decrement < 0) return;
        credit.ifPresent(current -> credit = Optional.of(current - decrement));
    }
    public Optional<Double> get() {
        return credit;
    }
}
Class Products & Request:
public class Products implements Comparable<Products> {
    private String name;
    private double value;
    public double value() {
        return value;
    }
    public void insertValue(double value) {
        this.value = value;
    }
    public String name() {
        return name;
    }
    public void insertName(String name) {
        this.name = name;
    }
    @Override
    public int compareTo(@NotNull Products products) {
        return Double.compare(this.value(), products.value());
    }
}
@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.Setter(value = lombok.AccessLevel.PUBLIC)
public class Requests extends Products {
    private List<Products> requests;
    public Requests() {
        requests = new ArrayList<>();
    }
    @Override
    public String toString() {
        return name()
                + " - "
                + value();
    }
}
 
             
             Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!
 Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

