java成员变量访问修饰符是数据控制权分配方案:private需配校验逻辑;default适用于包内协作;protected慎用字段,优先方法;public接口须精简且带语义约束。

Java 成员变量的访问修饰符不是语法装饰,而是数据控制权的分配方案。选对修饰符,等于提前划清协作边界;配好访问方法,才能让封装真正落地。
private 是起点,但必须配校验逻辑
声明 private 只是封住直接访问通道,不等于数据自动安全。比如一个 private int age,若 setter 仅做简单赋值,外部仍可传入 -5 或 300 这类非法值。
- 所有 setter 方法必须做参数校验:范围检查(如 0–150)、非空判断、格式验证
- 校验失败抛出明确异常,例如
IllegalArgumentException("age must be between 0 and 150") - 构造器中也要校验,避免对象一创建就处于非法状态
- getter 若返回可变对象(如
ArrayList、Date),需返回防御性拷贝或不可修改视图,例如Collections.unmodifiableList(tags)
default 适合模块内高内聚协作
不加修饰符的 default 权限天然适配同一业务包内的协作场景。例如订单模块中 Order、OrderItem、Payment 都在 com.example.order 包下,它们之间可共享中间计算字段或工具方法,但对外部包完全不可见。
- 跨包调用时,default 成员直接编译报错,天然隔离外部依赖
- 比 public 更轻量,比 private 更灵活,适合包内解耦
- 不要为图方便把本该 private 的字段改成 default,否则会意外暴露实现细节
protected 要慎用字段,优先暴露方法
protected 是为继承设计的,但直接暴露字段会让子类与父类实现强耦合。例如父类定义 protected List<string> tags</string>,子类可能直接修改该列表,破坏父类状态一致性。
- 优先用
protected void addTag(String tag)这类受控方法替代 protected 字段 - 若必须暴露集合类字段,getter 应返回不可修改视图
- 子类不该依赖父类字段名或类型,而应通过方法契约交互
- protected 字段在子类中可见,但非子类即使同包也无法访问
public 接口要精简且带语义约束
public 方法是外界唯一合法入口,每个都是数据守门人。它不能只是透传字段,而要承载业务规则和安全边界。
- 不要为每个 private 字段机械生成 getter/setter——只暴露真正需要被外部读写的属性
-
setAge(int)必须校验范围;setName(String)要拒绝 null 或空白字符串 -
getBalance()返回 BigDecimal 或集合时,不能返回原始引用,需做防御性拷贝 - boolean 类型 getter 按 Java Bean 规范命名为
isXxx(),而非getXxx()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











