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; } }
关键逻辑解释
- 默认初始化:一开始就把日期设为2000-01-01,这样不用在每个失败分支重复赋值,代码更简洁。
- 年份校验:直接用if判断是否在1000到9999之间,确保是4位整数。
- 月份校验:同样用if锁定1-12的范围,不符合的话直接跳过后续判断。
- switch处理月份天数:
- 把31天的月份归为一组,30天的归为一组,减少重复代码
- 二月单独处理,用嵌套if判断闰年:能被4整除但不能被100整除,或者能被400整除的年份是闰年,二月有29天,否则28天。
- 日期校验:最后判断输入的日期是否在当前月份的最大天数范围内,符合的话才更新实例变量。
测试场景提示
你可以测试这些边界情况,确保逻辑没问题:
- 无效年份:比如999、10000 → 应该返回2000-01-01
- 无效月份:0、13 → 返回默认值
- 无效日期:2010年2月31日、2024年4月31日 → 返回默认值
- 闰年二月:2020年2月29日 → 应该被正常初始化
- 平年二月:2021年2月28日 → 正常初始化
内容的提问来源于stack exchange,提问作者Eric Parker
相关产品推荐
相关产品推荐

