Java构建带事件属性的日历:如何访问修改ArrayList数据?
问题根源
你现在没法直接操作参会人列表,核心是两点:
Teilnehmer被private修饰,按照Java访问控制规则,其他类没有权限直接读写这个成员变量- 就算放开访问权限,直接把ArrayList的原引用暴露给外部,也会完全破坏封装:外部拿到引用后可以随意清空列表、塞不符合规则的对象,直接绕开Termin类的逻辑约束,属于不规范的写法
落地实现方法
1. 先修正现有代码的基础问题
- 遵循Java命名约定:类名用大驼峰,把原来的
termin改成Termin;成员变量用小驼峰,把Date/Time/Titel/Kategorie改成date/time/titel/kategorie,避免和JDK自带的时间类命名冲突。 - 把Person类从Termin内部挪出去作为独立的顶级类:你提到Person是单独定义的类,现在的嵌套写法会让Person变成Termin的非静态内部类,实例化必须绑定Termin对象,和你的业务逻辑不匹配。
2. 给Termin类封装参会人列表的操作方法
不需要暴露内部list的引用,按照实际业务需要写对应的操作入口,列表依然保持private修饰:
import java.time.LocalDate; import java.time.LocalTime; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Termin { private LocalDate date; private LocalTime time; private String titel; private String kategorie; // 内部维护参会人列表,保持私有 private List<Person> teilnehmer = new ArrayList<>(); public Termin(LocalDate date, LocalTime time, String titel, String kategorie) { this.date = date; this.time = time; this.titel = titel; this.kategorie = kategorie; } // 新增参会人,可自定义校验规则 public void addTeilnehmer(Person person) { // 示例校验:不允许加空对象、不允许重复加同一个人 if (person != null && !teilnehmer.contains(person)) { teilnehmer.add(person); } } // 按对象删除参会人 public boolean removeTeilnehmer(Person person) { return teilnehmer.remove(person); } // 按下标删除参会人 public Person removeTeilnehmer(int index) { return teilnehmer.remove(index); } // 获取所有参会人,返回只读副本,不暴露原列表引用 public List<Person> getTeilnehmerListe() { return Collections.unmodifiableList(teilnehmer); } // 清空所有参会人 public void clearTeilnehmer() { teilnehmer.clear(); } // 其他字段的getter/setter按需补充即可 }
3. 外部调用示例
封装完成后,其他类操作参会人列表不需要关心内部是用ArrayList还是其他List实现,直接调用方法即可:
// 实例化一个日程 Termin teamMeeting = new Termin( LocalDate.of(2024, 6, 1), LocalTime.of(14, 0), "项目周会", "工作" ); // 添加参会人 teamMeeting.addTeilnehmer(new Person("Thomas", "Nero")); teamMeeting.addTeilnehmer(new Person("Anna", "Mueller")); // 查看所有参会人 List<Person> allAttendees = teamMeeting.getTeilnehmerListe(); // 删除指定参会人 teamMeeting.removeTeilnehmer(new Person("Thomas", "Nero"));
补充提示
如果需要修改某个参会人的姓名等属性,不需要调整列表本身的结构——只要给Person类加上对应的setter方法就行,因为列表存的是Person的对象引用,直接修改对象内部属性不会破坏列表的存储结构。
内容的提问来源于stack exchange,提问作者Tantrum
相关产品推荐
相关产品推荐

