我正在创建一个非常简单的交互式程序,用户可以在其中选择饮料的类型、配菜及其大小。 该程序可以工作,但我想知道是否有一种更智能的方法可以将所有内容都放在一个 while 循环中。每个用户提示问题都有一个 while 循环的原因是因为我想再次询问上一个问题,直到用户做出一个有效输入。我想不出一种方法可以在一个 while 循环中具有相同的功能。
此外,我的辅助方法似乎也很重复(drinkTypeChecker 方法和 sideTypeChecker 方法)。如果有人可以帮助我以更简洁的方式写作,减少重复,这会对我有很大帮助。
这是java代码:
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;
}
};
}
}
这里有单独的饮料和副食课程供参考
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;
};
}
}
该程序已经可以运行,但我想学习使我的代码更简单,减少重复。
看起来是使用工厂模式的好机会,您可以在这里查看更多信息:工厂模式。什么时候使用工厂方法?
还可以尝试泛型与工厂实现,这是一个很好的实践:Java 通用工厂模式实现