Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Utilizando Enum para categorizar os Livros

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;
}
1 resposta
solução!

Oi, Rick! Como vai?

Sua organização com o uso do Enum para categorizar os livros ficou clara e eficiente. A divisão entre as classes e a lógica do método switchCase tornam seu código mais legível e fácil de manter. Muito legal também ver como você está explorando suas habilidades com propósito.

Uma dica interessante para o futuro é o uso do método valueOf() com enums, quando a entrada for exatamente o nome da constante. Veja este exemplo:


Category category = Category.valueOf("F");

Esse código acessa a constante F diretamente, sem precisar de switch. Útil quando os valores vêm de fontes seguras, como menus ou dados já validados.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!