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

Java实现养老院床位与不同容量房间的类关联分配问题求助

现存代码核心问题梳理

Beds类的逻辑缺陷

  • 无全局床位入池逻辑:静态全局列表beds没有提供统一的实例注册入口,新建的床位对象不会自动加入列表,后续全局查询、床位转移操作都会因为池内无数据报错。
  • 占用状态逻辑错误:setPatient方法无论传入的患者参数是否为null,都会强制将occupied设为true,导致空床位无法被正确标记为未占用,哪怕清空了患者信息,床位永远显示为已占用。
  • 构造方法逻辑冲突:直接在构造函数内调用setPatient,新建空床位(传入null患者)时会被自动标记为已占用,和实际状态不符。
  • 转移方法逻辑失效:assignBed作为实例方法,本身就代表当前操作的老床位,但方法内既不校验传入的oldBed参数是否匹配当前床位编号,也不校验索引越界问题,只要调用就会无差别转移患者,完全失去了老床位的校验作用。
  • 冗余字段:类内定义的totalBeds实例字段无实际业务作用,和全局床位计数逻辑混淆。

Rooms类的逻辑缺陷

  • 直接编译报错:类内同时定义了实例字段ArrayList<Beds> beds和静态字段Beds beds,命名冲突,无法通过编译。
  • 无容量校验逻辑:构造方法不校验传入的总床位数是否符合1/2/4床的规格要求,也不校验传入的床位列表长度是否和容量匹配,随意塞不同数量的床位都能初始化成功。
  • 冗余状态无动态计算:full字段靠构造方法手动传入,没有和当前房间的实际绑定床位数量做联动,哪怕房间床位全空,只要构造时传了full=true,就会永远显示为满房;反之哪怕床位全满,也会显示为可入住。
  • 无绑定校验逻辑:没有拦截“一个床位同时绑定多个房间”的情况,也没有在绑定的时候给床位回写所属房间的关联信息,导致床位和房间的关联是单向的——只能从房间查下属床位,不能从床位反查所属房间,整个链路是断的。
两类关联打通的核心设计思路
  • 做双向关联:在Beds类中新增belongRoom字段,存储当前床位所属的Room对象;在Rooms类中维护下属的床位列表,实现从床位到房间、从房间到床位的双向查询,避免链路断裂。
  • 冗余状态全部改为动态计算:不再手动维护full、occupied这类容易不同步的布尔值,所有状态直接根据实际数据实时计算:
    • 床位是否占用:直接判断当前床位关联的患者是否为null
    • 房间是否满员:直接判断当前房间绑定的床位数量是否等于预设容量
  • 绑定逻辑加严格校验:
    • 房间初始化时就锁死1/2/4的容量,不接受其他数值
    • 绑定床位前,校验房间是否已经达到容量上限
    • 绑定床位前,校验目标床位是否已经绑定到其他房间,避免一床多属
    • 绑定成功后,自动给床位回写所属房间的引用,保证双向关联的一致性
  • 全局对象池统一管理:Beds、Rooms类的静态全局列表,在构造方法内自动把新实例加入池中,不需要手动维护,保证全局可查询。
修正后的核心代码参考

修正后的Beds类核心逻辑

public class Beds {
    private int bedNo;
    private Patients patient;
    private Rooms belongRoom;
    // 全局床位池
    private static ArrayList<Beds> globalBeds = new ArrayList<>();

    public Beds(int bedNo, Patients patient) {
        this.bedNo = bedNo;
        this.patient = patient;
        // 构造完成自动入池
        globalBeds.add(this);
    }

    // 占用状态实时计算:有患者就是占用
    public boolean isOccupied() {
        return patient != null;
    }

    // 修正患者设置逻辑:传null自动标记为未占用
    public void setPatient(Patients patient) {
        this.patient = patient;
    }

    // 修正床位转移逻辑:接收目标床位实例,避免索引混淆
    public void transferTo(Beds targetBed) {
        if (targetBed.isOccupied()) {
            System.out.println("Sorry that bed is taken. Please try again");
            return;
        }
        targetBed.setPatient(this.patient);
        this.setPatient(null);
    }

    // 省略所有getter/setter方法
}

修正后的Rooms类核心逻辑

public class Rooms {
    private int roomNo;
    // 房间容量仅支持1/2/4
    private int capacity;
    private ArrayList<Beds> roomBeds = new ArrayList<>();
    // 全局房间池
    private static ArrayList<Rooms> globalRooms = new ArrayList<>();

    public Rooms(int roomNo, int capacity) {
        // 初始化时校验容量合规
        if (capacity != 1 && capacity != 2 && capacity != 4) {
            throw new IllegalArgumentException("房间仅支持1、2、4床三种规格");
        }
        this.roomNo = roomNo;
        this.capacity = capacity;
        // 构造完成自动入池
        globalRooms.add(this);
    }

    // 满员状态实时计算:绑定床位数等于容量就是满
    public boolean isFull() {
        return roomBeds.size() == capacity;
    }

    // 新增床位绑定逻辑
    public void bindBed(Beds bed) {
        if (isFull()) {
            System.out.println("该房间已满,无法绑定新床位");
            return;
        }
        // 校验床位是否已经被绑定
        if (bed.getBelongRoom() != null) {
            System.out.println("该床位已归属房间" + bed.getBelongRoom().getRoomNo());
            return;
        }
        // 绑定成功:加入列表、回写关联
        roomBeds.add(bed);
        bed.setBelongRoom(this);
    }

    // 省略所有getter/setter方法
}
分层资源分配流程落地步骤
  1. 先完成底层资源初始化:按照病区规划,依次创建对应规格的房间(1/2/4床)、创建独立的床位实例,所有对象自动进入全局池统一管理。
  2. 完成床位-房间绑定:按照房间容量调用bindBed方法,把独立床位关联到对应房间,系统自动完成容量校验、重复绑定校验,绑定完成后可以双向查询床位和房间的对应关系。
  3. 后续关联病区时,只需要在Rooms类中新增belongWard字段,重复同样的绑定逻辑,就能打通房间-病区的关联,最终形成完整的“患者-床位-房间-病区”分层分配链路。
  4. 患者分配床位时,直接从全局床位池筛选未占用的床位,调用setPatient方法完成绑定即可,不需要额外维护占用状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 14:54:04