Python开发者求助:Java自定义对象中如何存储活动日期与星期数据
关于Java活动类中存储星期方案的解答
嘿,看来你在Java里设计活动类的时候遇到了存储星期的方案选择问题,我来帮你梳理清楚!
首先先聊聊你考虑的两种方案的区别:
- ArrayList
方案 :优点是直观,直接存"周一""周二"这类字符串,但缺点也很明显——判断时依赖contains()方法,如果字符串格式不统一(比如不小心写成"星期一"而非"周一")就会匹配失败;而且每次判断都要遍历列表,虽然7个元素性能影响不大,但代码可读性不如直接通过索引访问。 - 布尔数组方案:这其实是更优的选择!它内存占用极小(7个布尔值只占几个字节),判断时直接通过索引取值,效率极高,而且代码逻辑清晰——比如
mDaysOfWeek[0]一眼就知道对应周一是否有活动,完全没有字符串匹配的风险。
重点解答:布尔数组完全可以作为类的成员变量!
Java允许将数组作为类的成员变量,实现起来非常简单,下面给你一个完整的示例代码,包含星期数组的定义、初始化、访问方法,还有日期存储的部分:
import java.util.ArrayList; import java.util.Arrays; public class Activity { // 成员变量:布尔数组,约定索引0=周一,1=周二...6=周日 private boolean[] mDaysOfWeek; // 存储每月日期,用ArrayList<Integer>存储1、23这类日期数字 private ArrayList<Integer> mDates; // 构造方法1:默认初始化,所有星期初始为不激活(false),日期列表为空 public Activity() { this.mDaysOfWeek = new boolean[7]; // 布尔数组默认值为false this.mDates = new ArrayList<>(); } // 构造方法2:传入已配置好的星期数组,同时做长度校验避免错误 public Activity(boolean[] daysOfWeek) { if (daysOfWeek.length != 7) { throw new IllegalArgumentException("星期数组长度必须为7(对应周一到周日)"); } // 拷贝数组,避免外部修改影响类内部的状态(保证封装性) this.mDaysOfWeek = Arrays.copyOf(daysOfWeek, 7); this.mDates = new ArrayList<>(); } // 设置指定星期是否激活(index范围0-6) public void setDayActive(int dayIndex, boolean active) { validateDayIndex(dayIndex); mDaysOfWeek[dayIndex] = active; } // 判断指定星期是否有活动 public boolean isActiveOnDay(int dayIndex) { validateDayIndex(dayIndex); return mDaysOfWeek[dayIndex]; } // 便捷方法:批量设置多个星期为激活状态 public void setMultipleDaysActive(int... dayIndices) { for (int index : dayIndices) { setDayActive(index, true); } } // 添加活动日期 public void addDate(int date) { if (date < 1 || date > 31) { throw new IllegalArgumentException("日期必须在1-31之间"); } mDates.add(date); } // 判断某个日期是否在活动列表中 public boolean isActiveOnDate(int date) { return mDates.contains(date); } // 私有工具方法:校验星期索引是否合法 private void validateDayIndex(int dayIndex) { if (dayIndex < 0 || dayIndex >= 7) { throw new IndexOutOfBoundsException("星期索引必须在0-6之间(0=周一,6=周日)"); } } }
代码关键点说明:
- 成员变量声明:直接用
private boolean[] mDaysOfWeek;声明即可,和普通成员变量的声明方式一致。 - 初始化方式:可以在构造方法里直接
new boolean[7]创建默认全为false的数组,也可以传入外部数组并做拷贝(避免外部修改影响内部状态,符合面向对象的封装原则)。 - 封装访问:通过
setDayActive()和isActiveOnDay()方法来操作数组,同时加入索引校验,避免越界错误,让代码更健壮。 - 便捷方法:
setMultipleDaysActive()可以一次性设置多个星期为激活状态,比如activity.setMultipleDaysActive(0, 2, 4)就表示周一、周三、周五有活动,非常方便。
最后总结
布尔数组作为类成员变量是完全可行的,而且是存储星期这类固定选项的最优方案——相比ArrayList
内容的提问来源于stack exchange,提问作者Seth Ratner
相关产品推荐
相关产品推荐

