能否在switch case中使用逻辑或(||)?求优化月份天数计算代码
优化月份天数查询程序的方案
原始代码
Scanner keyboard = new Scanner(System.in); out.print("Enter month : "); String month = keyboard.nextLine().toLowerCase(); switch (month){ case "january" : out.println("31 days"); break; case "february" : out.println(""); out.print("Is it a leap year (yes/no): "); String leap_year = keyboard.nextLine().toLowerCase(); if (leap_year.equals("no")){ out.println("28 days"); break; } if (leap_year.equals("yes")){ out.println("29 days"); break; } else{ out.println("Invalid option.. Use yes/no only."); break; } case "march" : out.println("31 days"); break; case "april" : out.println("30 days"); break; case "may" : out.println("31 days"); break; case "june" : out.println("30 days"); break; case "july" : out.println("31 days"); break; case "august" : out.println("31 days"); break; case "september" : out.println("30 days"); break; case "october" : out.println("31 days"); break; case "november" : out.println("30 days"); break; case "december" : out.println("31 days"); break; default : out.println("Enter a correct month"); break; } keyboard.close();
用Switch多Case简化代码(替代逻辑或)
Java 7及以上支持字符串类型的Switch,并且允许将多个case合并,把天数相同的月份放在一起,直接减少重复代码:
Scanner keyboard = new Scanner(System.in); out.print("Enter month : "); String month = keyboard.nextLine().toLowerCase(); switch (month) { case "january": case "march": case "may": case "july": case "august": case "october": case "december": out.println("31 days"); break; case "april": case "june": case "september": case "november": out.println("30 days"); break; case "february": out.print("Is it a leap year (yes/no): "); String leapYearInput = keyboard.nextLine().toLowerCase(); if ("no".equals(leapYearInput)) { out.println("28 days"); } else if ("yes".equals(leapYearInput)) { out.println("29 days"); } else { out.println("Invalid option.. Use yes/no only."); } break; default: out.println("Enter a correct month"); break; } keyboard.close();
其他优化建议
提取闰年判断逻辑为独立方法:把二月的闰年判断抽成单独方法,让主逻辑更简洁,也方便复用:
private static void printFebruaryDays(Scanner scanner, PrintStream out) { out.print("Is it a leap year (yes/no): "); String input = scanner.nextLine().toLowerCase(); switch (input) { case "yes": out.println("29 days"); break; case "no": out.println("28 days"); break; default: out.println("Invalid option.. Use yes/no only."); } }主代码里直接调用这个方法即可。
使用枚举类管理月份:用枚举存储月份名称和天数(二月特殊处理),增强类型安全,避免字符串输入的潜在错误:
enum Month { JANUARY(31), FEBRUARY(28), MARCH(31), APRIL(30), MAY(31), JUNE(30), JULY(31), AUGUST(31), SEPTEMBER(30), OCTOBER(31), NOVEMBER(30), DECEMBER(31); private final int days; Month(int days) { this.days = days; } public int getDays(boolean isLeapYear) { if (this == FEBRUARY && isLeapYear) { return 29; } return days; } }之后可以通过
Month.valueOf(month.toUpperCase())获取枚举实例,再调用方法获取天数。循环校验输入合法性:对于月份和闰年的输入,如果用户输入错误,循环提示直到输入正确,提升用户体验。
支持数字月份输入:允许用户输入1-12的数字,再映射到对应月份,增加程序的灵活性。
内容的提问来源于stack exchange,提问作者Yashwant Balaji
相关产品推荐
相关产品推荐

