Java Group类开发:如何拦截违规操作、过滤同ID用户仅留首个
Group类开发问题的落地实现
1. 同ID重复数据去重,保留首次出现的条目
- 实现核心:在添加操作的最前置环节做同ID校验,只要遍历命中已存在的同ID Kid,就直接拦截后续重复条目,保证第一次插入的同ID记录永远保留,绝不被后续重复数据覆盖。
- 前置要求:Kid类需要基于业务唯一标识(如学员编号、身份ID)重写
equals()和hashCode()方法,避免靠对象内存地址误判重复条目。 - 优化后的添加逻辑代码:
public boolean addKid(Kid k) { // 重复校验:遍历现有列表,命中同ID直接拦截 for (Kid registeredKid : kids) { if (registeredKid.getId().equals(k.getId())) { System.out.println("操作提示:检测到ID为" + k.getId() + "的重复学员条目,已忽略该重复输入"); return false; } } // 容量校验:超出班组上限直接拦截 if (kids.size() >= MAX_LIMIT) { System.out.println("操作提示:班组人数已达" + MAX_LIMIT + "的上限,无法添加新学员"); return false; } kids.add(k); return true; }
2. 拦截破坏对象合法状态的违规操作
- 堵上现有代码的状态泄漏漏洞:原代码中
getKids()直接返回内部ArrayList的原始引用,外部代码可以完全绕过类内部的容量校验、重复校验规则随意增删学员,从根源上破坏Group对象的合法状态。需要修改该方法为返回内部集合的只读副本,禁止外部直接篡改内部列表。 - 全链路状态校验:对
addKid、removeKid等所有会修改内部状态的方法,在执行实际修改前做合法性判断,校验不通过时直接输出明确的错误提示,说明违规原因,不让对象静默进入非法状态。 - 优化后的相关代码:
import java.util.Collections; import java.util.List; // 优化后的只读getKids方法 public List<Kid> getKids() { // 返回不可修改的集合视图,外部无法绕过类校验逻辑篡改列表 return Collections.unmodifiableList(kids); } // 优化后的removeKid方法 public boolean removeKid(Kid k) { // 前置校验:待删除学员不存在时直接拦截提示 if (!kids.contains(k)) { System.out.println("操作提示:当前班组不存在ID为" + k.getId() + "的学员,删除操作未生效"); return false; } return kids.remove(k); }
- 补充注意点:不要为
trainer、sportName等内部字段暴露无校验的公开setter,若需修改这些字段,要在setter里加非空校验,避免传入null值导致对象状态异常。
内容的提问来源于stack exchange,提问作者Isy
相关产品推荐
相关产品推荐

