Java中成员变量应设为private并提供getter/setter方法,以保障封装性、数据校验与逻辑扩展能力;直接public字段会破坏封装,导致无法拦截非法值或统一处理变更逻辑。

Java 中成员变量通过 getter 和 setter 方法实现访问控制,核心是将字段设为 private,再提供公共的、受控的读写方法。这既保护了数据完整性,又为后续逻辑扩展(如校验、日志、通知)留出空间。
为什么不能直接暴露 public 字段
直接把成员变量声明为 public 会破坏封装性:外部代码可任意读写,无法拦截非法值(比如年龄设为 -5)、无法统一处理变更逻辑(如修改密码后自动清空登录态)、也无法在将来添加验证而不改调用方代码。
标准 getter/setter 的写法规范
遵循 JavaBean 规范,方法名以 get/set 开头,首字母大写,返回类型/参数类型与字段一致(boolean 类型的 getter 可用 is 开头):
- private String name; → public String getName() { return name; } / public void setName(String name) { this.name = name; }
- private int age; → public int getAge() { return age; } / public void setAge(int age) { this.age = age; }
- private boolean active; → public boolean isActive() { return active; }(推荐)或 public boolean getActive() { return active; }
在 setter 中加入业务校验和逻辑
setter 不只是赋值,更是数据入口。常见做法包括:
立即学习“Java免费学习笔记(深入)”;
- 非空检查:
if (name == null || name.trim().isEmpty()) throw new IllegalArgumentException("姓名不能为空"); - 范围限制:
if (age 150) throw new IllegalArgumentException("年龄必须在 0~150 之间"); - 状态联动:
if (newValue) { this.lastActivatedTime = System.currentTimeMillis(); } - 防御性拷贝(对可变对象):
this.data = new ArrayList(data);避免外部修改影响内部状态
getter 也可封装计算或懒加载逻辑
getter 不一定只返回字段值,还可用于:
- 延迟初始化:
if (expensiveObject == null) expensiveObject = createExpensiveObject(); return expensiveObject; - 派生值计算:
return firstName + " " + lastName; - 安全脱敏:
return phone != null ? phone.replaceAll("(\d{3})\d{4}(\d{4})", "$1****$2") : null; - 线程安全读取(配合 volatile 或 synchronized,视场景而定)


















