Задача по применению 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 шт):
Очень похоже, что оператор 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);