I’m creating a very simple interactive program where a user selects the type of Drink, Side, and their sizes. The program works but I was wondering if there is a smarter way to have everything in one while loop. The reason I have a while loop per user-prompt question is because I want to ask the previous question again until the user makes a valid input. I couldn’t think of a way to have this same functionality in one while loop.
Additionally, it also seems like the helper methods I have can seem repetitive (drinkTypeChecker method and sideTypeChecker Method). It would help me a lot if someone can help me write in a cleaner way with less repetition.
Here is the java code:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
boolean drinkTypeChecker = false;
boolean sizeChecker= false;
boolean sideTypeChecker = false;
String drinkType = "";
String drinkSize = "";
String sideType = "";
String sideSize = "";
Scanner in = new Scanner(System.in);
System.out.println("Welcome to Bills Burger!");
while(!drinkTypeChecker) {
System.out.println("Please select a Drink Type! (Coke, Zero, Sprite, Fanta)");
drinkType = in.nextLine();
drinkTypeChecker = drinkTypeChecker(drinkType);
}
while(!sizeChecker) {
System.out.println("Please select a Drink Size! (S, M, L)");
drinkSize = in.nextLine();
sizeChecker = sizeChecker(drinkSize);
}
while(!sideTypeChecker) {
System.out.println("Please select a Side Type! (Fries, Salad, Coleslaw)");
sideType = in.nextLine();
sideTypeChecker = sideTypeChecker(sideType);
}
sizeChecker = false;
while(!sizeChecker) {
System.out.println("Please select a Side Size! (S, M, L)");
sideSize = in.nextLine();
sizeChecker = sizeChecker(sideSize);
}
Drink drink = new Drink(drinkType, drinkSize);
Side side = new Side(sideType, sideSize);
System.out.println("Your total price is $" + (drink.getPrice() + side.getPrice()));
in.close();
}
public static boolean drinkTypeChecker(String drinkType) {
if(drinkType.length() == 0) {
System.out.printf("ERROR: You have not selected a drink type. Please input a drink type!%n%n%n");
return false;
}
return switch (drinkType.toUpperCase()) {
case "COKE", "ZERO", "SPRITE", "FANTA"-> true;
default -> {
System.out.printf("ERROR: Invalid Drink Type!%n%n%n");
yield false;
}
};
}
public static boolean sideTypeChecker(String type) {
if(type.length() == 0) {
System.out.printf("ERROR: You have not selected a side type. Please input a side type!%n%n%n");
return false;
}
return switch (type.toUpperCase()) {
case "FRIES", "SALAD", "COLESLAW" -> true;
default -> {
System.out.printf("ERROR: Invalid Side Type!%n%n%n");
yield false;
}
};
}
public static boolean sizeChecker(String size) {
return switch (size.toUpperCase()) {
case "S", "M", "L" -> true;
default -> {
System.out.printf("ERROR: Invalid Size!%n%n%n");
yield false;
}
};
}
}
Here is the separate Drink and Side Class for reference
public class Drink {
private String type;
private String size;
private double price;
public Drink(String type, String size) {
this.type = type;
this.size = size;
}
public double getPrice() {
String size = this.size.toUpperCase();
return switch (size.toUpperCase()) {
case "S" -> 0.00;
case "M" -> 0.50;
case "L" -> 0.75;
default -> -1;
};
}
}
public class Side {
private String type;
private String size;
private double price;
public Side(String type, String size) {
this.type = type;
this.size = size;
}
public double getPrice() {
String size = this.size.toUpperCase();
return switch (size.toUpperCase()) {
case "S" -> 0.00;
case "M" -> 0.65;
case "L" -> 0.90;
default -> -1;
};
}
}
The program already works but I want to learn to make my code more simple with less repetition.
Alwoo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.