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();
}
}