You need to enable JavaScript to run this app. Java构建带事件属性的日历:如何访问修改ArrayList数据?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 03:06:04