Esta é a minha solução para a resolução do desafio proposto. Estou tentando me desafiar nestes projetos simples da formação. Estou me divertindo e está sendo bem gratificante fazer e me arriscar a tentar algo melhor, utilizando meus conhecimentos.
Espero que esta resolução sirva para alguém que está dando seus primeiros passos na carreira com Java. E assim ficou o resultado do desafio:
Class Main
package org.maelys;
public class Main {
public static void main(String[] args) {
/* Creating a currency object with a value */
Currency price = new Currency();
price.appendCash(49.90);
if (price.giveCash() == -1) return;
/* Creating a Book object with value */
Book book = new Book(
"Clean Code",
"Robert C. Martin",
464,
price
);
/* Calling the SwitchCase method with the category 'T' (Technology) */
Category.switchCase('T', book);
/* Test with another category */
Category.switchCase('F', new Book(
"The Hobbit",
"J.R.R. Tolkien",
310,
new Currency() {{
appendCash(39.99);
}}
));
/* Testing with Invalid Category */
Category.switchCase('X', book);
}
}
Enum Category
package org.maelys;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.DecimalFormat;
@lombok.ToString(of = "category")
@lombok.RequiredArgsConstructor(access = lombok.AccessLevel.PRIVATE)
public enum Category {
F("Fiction"),
N("Non-fiction"),
T("Technology"),
H("History");
@lombok.Getter(value = lombok.AccessLevel.PRIVATE)
private final String category;
public static void switchCase(char category, @NotNull Book book) {
Category arg = fromChar(category);
if (arg == null) return;
print(arg, book);
}
@Contract(pure = true)
private static @Nullable Category fromChar(char arg) {
return switch (arg) {
case 'F' -> F;
case 'N' -> N;
case 'T' -> T;
case 'H' -> H;
default -> null;
};
}
private static void print(@NotNull Category category, @NotNull Book book) {
DecimalFormat dollar = new DecimalFormat("'$' #,##0.00");
System.out.printf(
"Book Registered: %s, by %s. It has %d pages, costs %s and belongs to category %s%n",
book.getTitle(),
book.getAuthor(),
book.getPages(),
dollar.format(book.getPrice().giveCash()),
category.getCategory()
);
}
}
Class Currency
package org.maelys;
@lombok.NoArgsConstructor(access = lombok.AccessLevel.PUBLIC)
public class Currency {
@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.Setter(value = lombok.AccessLevel.PRIVATE)
private double cash;
public double giveCash() {
if (this.cash < 0) return -1;
return this.cash;
}
public void appendCash(double cash) {
if (cash < 0) return;
this.cash += cash;
}
public void removeCash(double cash) {
if (cash != 0 && cash < this.cash)
this.cash -= cash;
}
}
Class Book
package org.maelys;
@lombok.ToString(of = {"title", "author", "pages", "price"})
@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.Setter(value = lombok.AccessLevel.PRIVATE)
@lombok.NoArgsConstructor(access = lombok.AccessLevel.PUBLIC)
@lombok.AllArgsConstructor(access = lombok.AccessLevel.PUBLIC)
public class Book {
private String title;
private String author;
private int pages;
private Currency price;
}