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

Java Date类构造器分支逻辑实现咨询(新手编程任务)

实现Date类构造器的switch+if分支方案

嘿,作为编程新手,处理日期有效性校验确实容易踩坑——我来给你一步步拆解怎么用switch和if的组合逻辑搞定这个Date构造器!咱们核心思路是先做基础范围校验,再针对不同月份的天数做精准判断,任何一步不通过就回退到默认的2000年1月1日。

整体逻辑步骤

咱们先理清楚校验的优先级:

  • 先初始化实例变量为默认值(2000-01-01),这样一旦校验失败直接用这个值
  • 校验年份是否为4位有效整数(1000 ≤ year ≤ 9999)
  • 校验月份是否在1-12之间
  • 根据月份,用switch判断该月的最大允许天数(重点处理二月的闰年情况)
  • 校验日期是否在1到对应月份的最大天数之间
  • 所有校验通过后,再把实例变量更新为输入的有效日期

代码实现示例(以Java为例)

public class Date {
    private int day;
    private int month;
    private int year;

    // 构造器
    public Date(int inputDay, int inputMonth, int inputYear) {
        // 先初始化默认日期
        this.day = 1;
        this.month = 1;
        this.year = 2000;

        // 第一步:校验年份是否为4位有效整数
        if (inputYear >= 1000 && inputYear <= 9999) {
            // 第二步:校验月份是否在1-12之间
            if (inputMonth >= 1 && inputMonth <= 12) {
                int maxDay = 0;
                // 第三步:用switch判断对应月份的最大天数
                switch (inputMonth) {
                    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
                        maxDay = 31;
                        break;
                    case 4: case 6: case 9: case 11:
                        maxDay = 30;
                        break;
                    case 2:
                        // 处理二月:判断闰年
                        if ((inputYear % 4 == 0 && inputYear % 100 != 0) || (inputYear % 400 == 0)) {
                            maxDay = 29;
                        } else {
                            maxDay = 28;
                        }
                        break;
                }
                // 第四步:校验日期是否在有效范围内
                if (inputDay >= 1 && inputDay <= maxDay) {
                    // 所有校验通过,更新实例变量
                    this.day = inputDay;
                    this.month = inputMonth;
                    this.year = inputYear;
                }
            }
        }
        // 只要任何一步校验失败,就保持默认的2000-01-01
    }

    // 可以添加getter方法方便测试
    public int getDay() { return day; }
    public int getMonth() { return month; }
    public int getYear() { return year; }
}

关键逻辑解释

  1. 默认初始化:一开始就把日期设为2000-01-01,这样不用在每个失败分支重复赋值,代码更简洁。
  2. 年份校验:直接用if判断是否在1000到9999之间,确保是4位整数。
  3. 月份校验:同样用if锁定1-12的范围,不符合的话直接跳过后续判断。
  4. switch处理月份天数:
    • 把31天的月份归为一组,30天的归为一组,减少重复代码
    • 二月单独处理,用嵌套if判断闰年:能被4整除但不能被100整除,或者能被400整除的年份是闰年,二月有29天,否则28天。
  5. 日期校验:最后判断输入的日期是否在当前月份的最大天数范围内,符合的话才更新实例变量。

测试场景提示

你可以测试这些边界情况,确保逻辑没问题:

  • 无效年份:比如999、10000 → 应该返回2000-01-01
  • 无效月份:0、13 → 返回默认值
  • 无效日期:2010年2月31日、2024年4月31日 → 返回默认值
  • 闰年二月:2020年2月29日 → 应该被正常初始化
  • 平年二月:2021年2月28日 → 正常初始化

内容的提问来源于stack exchange,提问作者Eric Parker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:27:24