封装提升复用性的核心是“隐藏变化、暴露稳定”,需明确职责边界、控制数据访问路径、提供构造约束与静态工厂、优先面向接口编程。

类设计时运用封装提升复用性,核心在于“隐藏变化、暴露稳定”,让外部只依赖清晰、有限、不易变的接口,而内部实现可自由演进。不是把所有字段设为 private 就算封装到位,而是围绕职责边界和使用场景做有意识的设计。
明确职责边界,一个类只解决一类问题
复用的前提是功能内聚。如果一个类既处理用户认证、又生成报表、还操作数据库,它几乎无法被安全复用——调用方总得为不需要的功能承担风险或额外配置。
- 例如:把“密码加密”逻辑单独抽成 PasswordEncoder 类,而不是塞进 UserService;后续登录、注册、重置密码等模块都能直接复用它,且升级算法(如从 MD5 切到 BCrypt)时,只需改这一个类。
- 再如:封装一个 RateLimiter 类,专注限流策略(令牌桶/漏桶)、阈值配置与判断逻辑,而非把它写在每个 HTTP 接口方法里。这样限流能力就能跨 Controller、Job、RPC 服务复用。
用私有字段 + 公共接口控制数据访问路径
把属性设为 private 不是为了“防人”,而是为了建立唯一可信的数据入口。所有修改都经由 setter 或专用方法,便于统一校验、触发事件、记录日志或兼容旧数据。
- 比如 Order 类中,private BigDecimal amount 配合 adjustAmount(BigDecimal delta) 方法,比直接开放 setAmount() 更安全——能确保调整后金额 ≥ 0,且自动更新状态字段。
- 避免提供无业务意义的 getter/setter。若某个字段仅用于序列化,但业务逻辑从不读写它,考虑用 Jackson 注解或 Builder 模式替代 public 访问器。
提供构造约束与静态工厂,屏蔽非法实例
允许任意参数创建对象,等于把校验责任推给每个调用方,复用时极易出错。通过构造函数限制或静态工厂方法预检,可让类天然“拒收坏数据”。
- 用私有构造 + 公共静态工厂:如 EmailAddress.create("user@domain.com") 内部验证格式、非空、长度,失败直接抛异常;使用者无需重复写正则校验,也杜绝了无效 Email 实例被传入多个服务。
- 对有状态组合的类(如分页查询参数),用 Builder 模式强制必填项、默认可选值,并在 build() 时做终态校验(如 pageSize > 0)。
接口优先,面向抽象而非实现复用
真正高复用的类,往往配合接口或抽象基类。调用方依赖接口,具体实现可替换——这是复用从“复制粘贴”走向“即插即用”的关键一步。
- 定义 NotificationSender 接口,再提供 SmsSender、EmailSender、WebhookSender 等实现。业务层只注入 NotificationSender,切换渠道无需改一行业务代码。
- 工具类如 DateFormatter,不要直接 new 具体实现,而是通过 DateFormatter.ofPattern("yyyy-MM-dd") 返回接口实例,内部可按 JDK 版本自动选用 java.time 或 legacy SimpleDateFormat。

















