java封装核心是隐藏实现、暴露安全接口,需私有化字段并受控访问,构造器确保合法初始化,方法职责内聚且隐藏细节,结合包级修饰符划定信任边界。

Java 封装原则的核心是“隐藏内部实现,暴露安全接口”,实际开发中不是靠加个 private 就算完成,而是围绕数据控制权、行为边界和协作契约来设计。
字段必须私有化,且提供受控访问
所有实例变量(尤其是状态相关的)应声明为 private,避免外部直接读写。需要访问时,用 getter/setter 方法,但不是无脑生成——要判断是否真该暴露。
- 只读字段:只提供 getter,不提供 setter(如 ID、创建时间)
- 校验逻辑必须放在 setter 中(如年龄不能为负、邮箱格式需验证)
- 集合类字段返回不可修改视图:
Collections.unmodifiableList(list),防止外部篡改内部容器 - 避免 getter 返回可变对象引用(如返回
new ArrayList(this.items)而非原引用)
构造器承担初始化责任,拒绝非法状态
封装不只是字段保护,更是确保对象从诞生起就处于有效状态。构造器应完成必要校验与默认赋值,不允许“半成品”对象存在。
- 参数校验在构造器第一行执行(如
Objects.requireNonNull(name)) - 避免空参构造器 + 大量 setter 组装对象,改用 Builder 模式或全参构造器
- 敏感字段(如密码、密钥)应在构造时完成处理(如哈希、加密),不以明文长期持有
方法设计体现职责内聚,隐藏实现细节
一个方法对外只承诺“做什么”,不暴露“怎么做”。内部算法、缓存策略、辅助对象等都应隐藏在 private 方法或内部类中。
- 把复杂逻辑拆成多个 private 辅助方法,提升可读性,又不破坏封装
- 避免 public 方法返回
this(链式调用除外),防止外部拿到引用后绕过约束修改状态 - 若需扩展行为,优先用组合(如传入
Formatter接口)而非暴露内部结构供继承重写
包级封装配合访问修饰符,划定信任边界
单靠 private 不够,合理使用 default(包私有)、protected 和模块系统(Java 9+)能更精细地控制可见性。
- 工具类中的核心算法设为包私有,仅对同包内业务类开放,避免被误用
-
protected仅用于明确支持继承的场景,且子类操作需仍符合父类不变量 - 模块
module-info.java中用exports精确声明哪些包对外可见,隐藏实现包(如internal或impl)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











