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/2/4床)、创建独立的床位实例,所有对象自动进入全局池统一管理。
- 完成床位-房间绑定:按照房间容量调用
bindBed方法,把独立床位关联到对应房间,系统自动完成容量校验、重复绑定校验,绑定完成后可以双向查询床位和房间的对应关系。 - 后续关联病区时,只需要在Rooms类中新增
belongWard字段,重复同样的绑定逻辑,就能打通房间-病区的关联,最终形成完整的“患者-床位-房间-病区”分层分配链路。 - 患者分配床位时,直接从全局床位池筛选未占用的床位,调用
setPatient方法完成绑定即可,不需要额外维护占用状态。
内容的提问来源于stack exchange,提问作者XzarKunn
相关产品推荐
相关产品推荐

