代码审查杜绝封装破坏需建立可量化规则,重点防控字段暴露、集合误返、无校验setter三类高危行为,强制private final+构造校验、不可变集合返回、按语义裁剪getter/setter、方法权限精准匹配调用边界,并加固反射与序列化风险。

代码审查中杜绝封装破坏,关键不是靠人工盯住每一行 private,而是建立可检查、可落地、可量化的审查规则。重点看三类高危行为:字段暴露、集合误返、无校验的 setter。
字段必须 private + final(核心状态)
审查时直接搜索 public 或 protected 修饰的非静态字段——一律视为缺陷。所有业务核心字段(如订单金额、用户等级、配置开关)必须满足:
- 声明为 private final,构造器中完成初始化与校验
- 禁止出现 public String name; 或 protected int status;
- 数组/集合类字段不能只加 final:final List
- items = new ArrayList(); 是错的;应改为 private final List
- items = Collections.unmodifiableList(new ArrayList());
- items = new ArrayList(); 是错的;应改为 private final List
getter/setter 不是标配,要按语义裁剪
IDE 自动生成的 getter/setter 是审查重灾区。需逐个确认:
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
- 只读字段(如订单 ID、创建时间)只保留 getter,删掉 setter
- 敏感字段(如 password、apiKey)的 getter 不返回明文,统一返回 "***" 或哈希摘要
- setter 必须含校验逻辑:例如 setAmount(BigDecimal amount) 中需 throw IllegalArgumentException if amount == null || amount.signum()
- 禁止暴露原始集合引用:getItems() 不返回 this.items,而应返回 new ArrayList(this.items) 或 ImmutableList.copyOf(this.items)
方法权限要匹配调用边界
方法不是越 public 越好,审查时按调用关系反推:
立即学习“Java免费学习笔记(深入)”;
- 仅被本类调用 → 必须 private
- 仅被同包内工具类调用 → 用默认(无修饰符),禁用 protected/public
- 供子类扩展但不对外 → protected,且需配套 javadoc 说明“此方法由子类实现,不可直接调用”
- 真正对外服务接口(如 Spring @RestController 方法、SDK 入口)→ 才用 public,且必须有完整输入校验和异常包装
警惕反射与序列化绕过(高阶加固)
Java 24 已移除 --illegal-access 参数,但审查仍需覆盖遗留风险:
- 单例类必须防御反射:私有构造器中添加 if (instance != null) throw new RuntimeException("Singleton violation");
- 实现 readResolve() 防止反序列化生成新实例
- 敏感类避免使用 java.util.* 等易被反射遍历的通用类型,优先用自定义不可变容器
- 模块化项目中,核心包应声明 requires static java.base; 并在 module-info.java 中用 exports 精确控制导出范围

















