Задача по применению enum - Меню напитков

Столкнулся с задачей, где нужно сделать автомат с напитками и в зависимости от выбора пользователя готовить ему напиток, дать возможность выбрать несколько напитков и в конце вывести выбранные пользователем напитки, подсчет количества каждого напитка, цену за каждый напиток и общую стоимость всех напитков. Нужно сделать switch-case оператор который будет делать напиток(вызывая соответствующий метод) в зависимости от выбора клиента. HashMap и Map еще не проходили.

Вот что я сделал, а дальше ступор :

Мой enum :

public enum Drinks {
    COFFEE(50), TEA(30), LEMONADE(70), MOHITO(80), MINERAL_WATER(40), COCA_COLA(50);

    private int price;
    
    Drinks(int price) {
        this.price = price;
    }
    public int getPrice() {
        return price;
    }
}

Main Класс :

public class DrinksMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String order;
        String stop;
        int number;
        int sum = 0;
        int totalPrice;
        System.out.println("Please choose your drink");
        System.out.println(Arrays.toString(Drinks.values()));
       do{
            number = scanner.nextInt();
            order = scanner.next().toUpperCase();
           System.out.println("Anything else ? - Yes/No");
           stop = scanner.next();
            }while (!stop.equals("No"));
        sum = sum + number;
        System.out.println("Preparing your order - " + sum + " cups");
        Drinks drinks = Drinks.valueOf(order);
        switch (drinks){
            case COFFEE :
                Drinks.valueOf("coffee").equals(Drinks.COFFEE);
                totalPrice = number * Drinks.COFFEE.getPrice();
                System.out.println(Drinks.COFFEE + " - Price - " + totalPrice);
                break;
            case TEA:
                Drinks.valueOf("tea").equals(Drinks.TEA);
                totalPrice = number * Drinks.TEA.getPrice();
                System.out.println(Drinks.TEA + " - Price - " + totalPrice);
                break;
            case LEMONADE:
                Drinks.valueOf("lemonade").equals(Drinks.LEMONADE);
                totalPrice = number * Drinks.LEMONADE.getPrice();
                System.out.println(Drinks.LEMONADE + " - Price - " + totalPrice);
                break;
            case MOHITO:
                Drinks.valueOf("mohito").equals(Drinks.MOHITO);
                totalPrice = number * Drinks.MOHITO.getPrice();
                System.out.println(Drinks.MOHITO + " - Price - " + totalPrice);
                break;
            case MINERAL_WATER:
                Drinks.valueOf("mineralWater").equals(Drinks.MINERAL_WATER);
                totalPrice = number * Drinks.MINERAL_WATER.getPrice();
                System.out.println(Drinks.MINERAL_WATER + " - Price - " + totalPrice);
                break;
            case COCA_COLA:
                Drinks.valueOf("cocaCola").equals(Drinks.COCA_COLA);
                totalPrice = number * Drinks.COCA_COLA.getPrice();
                System.out.println(Drinks.COCA_COLA + " - Price - " + totalPrice);
                break;
            default:
                System.out.println("Incorrect order");
        }
    }
}

Ответы (1 шт):

Автор решения: Nowhere Man

Очень похоже, что оператор switch в данном случае совершенно НЕ нужен, так как в нём дублируется по сути один и тот же код, включая непонятные строки вида Drinks.valueOf("coffee").equals(Drinks.COFFEE), которые будут падать с IllegalArgumentException, так как поиск по названию значения зависит от регистра и Drinks.valueOf("coffee") выбросит соответствующее исключение: java.lang.IllegalArgumentException: No enum constant MyClass.Drinks.coffee.

Таким образом, представленный код может быть сокращён до следующего безо всяких switch/case:

String order = "";
String stop;
int cups = 0;
int totalCups = 0;
int totalPrice = 0;
System.out.println("Please choose your drink");
System.out.println(Arrays.toString(Drinks.values()));
do {
    cups = scanner.nextInt();
    Drinks drinks = Drinks.valueOf(scanner.next().toUpperCase());

    totalCups += cups;
    totalPrice += cups * drinks.getPrice();
    order += String.format("%d cup(s) of %s for %d = %d%n", cups, drinks, drinks.getPrice(), cups * drinks.getPrice());

    System.out.println("Anything else ? - Yes/No");
    stop = scanner.next();
} while ("Yes".equalsIgnoreCase(stop));

System.out.println("Preparing your order - " + totalCups + " cups:");
System.out.println(order);
System.out.println("Total price: " + totalPrice);
→ Ссылка