You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:27:16