关键在于用自定义Iterator实现每次next()的可控校验,而非简单封装集合;需在hasNext()和next()中嵌入限数量、筛状态、验权限等逻辑,并禁用remove()和forEachRemaining()以防绕过,仅暴露Iterable接口。

规范数据访问边界,关键不是靠“封住集合”,而是让每次 next() 都经过可控校验。直接返回 Collections.unmodifiableList() 或复制新集合,只能防改,不能防看——调用方仍能通过 size()、get(0)、toArray() 窥探全部内容,违背“受限”本意。
用自定义 Iterator 控制每一次取值
真正有效的边界控制,是在 hasNext() 和 next() 方法里嵌入逻辑判断,比如限数量、筛状态、验权限、控频率。每次调用 next() 时才决定是否允许返回、返回哪个、是否计数、是否触发限流。
- 只允许读前 3 条:在
hasNext()中维护计数器,超过即返回false - 仅返回未过期的会话:在
next()中跳过已失效项,直到找到有效项或遍历完 - 禁止批量暴露:不实现
forEachRemaining(),或重写为抛异常,防止绕过逐个检查
覆盖 remove() 和 forEachRemaining() 防绕过
默认的 remove() 是可选操作,但若你允许删除,必须确保它也走相同校验路径;更常见的是彻底禁用——重写为抛 UnsupportedOperationException。同样,forEachRemaining() 本质是一次性批量消费,极易跳过单次控制逻辑,应显式覆盖并限制行为(如仅允许最多处理 10 个)。
不暴露底层结构,只提供 Iterable 接口
对外只声明 implements Iterable<T>,并重写 iterator() 返回私有内部迭代器。这样调用方只能用 for-each 或手动 hasNext()/next(),无法获得长度、索引、随机访问能力,也无法得知底层是 List、Map 还是数据库游标。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 避免返回
public List<T> getData() { return new ArrayList<>(privateList); } - 避免返回
public List<T> getData() { return Collections.unmodifiableList(privateList); } - 正确做法:
public Iterator<T> iterator() { return new ControlledIterator(); }
结合业务场景做懒加载与状态联动
边界不只是“数量”或“时间”,还可能是资源状态。例如会话管理中,next() 可以触发自动续期逻辑;日志迭代器可在 hasNext() 中检查磁盘空间是否充足;审计数据迭代器可同步记录访问日志。这些动作天然耦合在“每次取值”这一原子操作中,无法被外部跳过。
不复杂但容易忽略

















