Java封装属性的核心是将字段设为private并提供public的getter/setter方法,以隐藏实现、保障安全访问和校验逻辑;直接暴露public字段会破坏封装性,导致非法修改与规则绕过。

Java 中封装属性的核心是把字段设为 private,再提供公共的 getter 和 setter 方法来控制读写。这样既隐藏了内部实现,又保留了对属性的安全访问和逻辑校验能力。
为什么要用 getter/setter 封装属性
直接暴露 public 字段会破坏封装性,导致外部代码随意修改、绕过业务规则(比如给年龄赋值 -5)。通过 getter/setter,你可以在读取或写入时加入判断、日志、计算或通知逻辑。
- 防止非法数据:setter 中检查参数是否合法
- 支持只读或只写:只提供 getter 或只提供 setter
- 便于后期扩展:比如 getter 返回计算值,而不是原始字段
- 兼容 JavaBeans 规范:很多框架(如 Spring、Jackson)依赖标准命名的 getter/setter
标准 getter/setter 的命名与写法
Java 约定 getter 以 get 开头(布尔类型可用 is),setter 以 set 开头,后接首字母大写的字段名。方法必须是 public,返回值和参数类型要匹配字段类型。
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
private String name;
private int age;
// getter
public String getName() {
return name;
}
public int getAge() {
return age;
}
// setter
public void setName(String name) {
this.name = name; // this.name 指成员变量,name 是参数
}
public void setAge(int age) {
if (age >= 0 && age <= 150) {
this.age = age;
} else {
throw new IllegalArgumentException("年龄必须在 0~150 之间");
}
}
常见使用场景和注意事项
实际开发中,getter/setter 不只是“复制粘贴”,需结合业务灵活设计:
- 延迟初始化:getter 中首次调用才创建对象(如懒加载 List)
-
不可变包装:getter 返回集合副本(如
new ArrayList(list)),避免外部修改原集合 -
计算属性:没有对应字段,getter 返回动态结果(如
getFullName()拼接 first + last) -
避免空指针:getter 对可能为 null 的引用类型做防御性返回(如返回
Collections.emptyList())
现代简化方式(Lombok)
手写 getter/setter 易出错且冗余。用 Lombok 可以用注解自动生成:
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class Person {
private String name;
private int age;
}
编译后自动拥有 getName()、setName(...) 等方法。也可细粒度控制:@Getter 加在字段上,或用 @Setter(AccessLevel.PROTECTED) 限制访问级别。

















