Main.java:
package br.com.alura.desafio5;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import br.com.alura.desafio5.model.Cartao;
import br.com.alura.desafio5.model.Compra;
public class Main {
public static void main(String[] args) {
//Cria um novo objeto do tipo Cartao e solicita o limite do cartão
Cartao cartao = new Cartao();
System.out.println("Digite o limite do cartão de crédito:");
Scanner scanner = new Scanner(System.in);
cartao.setLimite(scanner.nextDouble());
//Cria uma lista utilizando interface List para armazenar as compras realizadas, e um menu para realizar as compras
List compras = new ArrayList<>();
int menu = 0;
while (menu != 2) {
System.out.println("Digite 1 para realizar uma compra ou 2 para sair:");
menu = scanner.nextInt();
if (menu == 1) {
//Limpa o buffer do scanner para evitar problemas na leitura dos dados
scanner.nextLine();
//Cria um objeto do tipo Compra
Compra compra = new Compra();
//Solicita nome do produto e seta ao objeto criado acima
System.out.println("Digite o nome do produto:");
String nome = scanner.nextLine();
compra.setNomeProduto(nome);
//Solicita o valor do produto e seta ao objeto criado acima
System.out.println("Digite o valor do produto:");
double valor = scanner.nextDouble();
compra.setValor(valor);
//Realiza a compra utilizando o método
if(cartao.realizarCompra(compra)){
//Adiciona a compra à lista de compras
compras.add(compra);
}
}
}
//Utiliza a Classe Collections para ordenar a lista de compras. O método sort espera como parâmetro uma lista de objetos que implementam a interface Comparable. Compra implementa Comparable e sobrescreve o método compareTo.
Collections.sort(compras);
//Impressão da lista de compras ordenada, utilizando o toString sobrescrito
System.out.println("Compras realizadas: \n" + compras);
}
}
Compra.java:
package br.com.alura.desafio5.model;
public class Compra implements Comparable<Compra> {
//Atributos da Classe
private String nomeProduto;
private double valor;
//Construtores
public Compra(String nomeProduto, double valor) {
this.nomeProduto = nomeProduto;
this.valor = valor;
}
public Compra(){}
//Getters e Setters
public String getNomeProduto() {
return nomeProduto;
}
public void setNomeProduto(String nomeProduto) {
this.nomeProduto = nomeProduto;
}
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
@Override
public String toString() {
return "Compra: %s - R$ %.2f".formatted(nomeProduto, valor);
}
//Método para comparar as compras pelo valor
@Override
public int compareTo(Compra arg0) {
//Compara o valor do objeto Compra atual com o valor do objeto Compra passado como parâmetro
//Delega a comparação para o método compare da Classe Double, que retorna - | 0 | + a depender do resultado da comparação
return Double.compare(this.valor, arg0.valor);
}
}
Cartao.java:
package br.com.alura.desafio5.model;
public class Cartao {
//Atributos
private double limite;
private double valorGasto;
//Construtores
public Cartao(double limite) {
this.limite = limite;
}
public Cartao(){}
//Getters e Setters
public double getLimite() {
return limite;
}
public void setLimite(double limite) {
this.limite = limite;
}
//Método que realiza a compra, verificando se o valor da compra excede o limite do cartão e retornando true ou false de acordo com o resultado da verificação
public boolean realizarCompra(Compra compra) {
if (compra.getValor() + valorGasto <= limite) {
valorGasto += compra.getValor();
System.out.println("Compra realizada com sucesso: " + compra);
return true;
}
System.out.println("Compra recusada. Limite insuficiente");
return false;
}
}