什么是 set 和 get 方法?
set 和 get 方法是Java编程中一种非常普遍和重要的编码规范,它们共同构成了访问器方法。

- Getter (Get方法): 用于获取(读取)一个对象的私有字段的值。
- Setter (Set方法): 用于设置(修改)一个对象的私有字段的值。
我们会将类的成员变量(字段)声明为 private(私有的),以实现封装这一面向对象的核心原则,我们通过 public(公有的)的 get 和 set 方法来间接地访问和修改这些私有变量。
为什么需要 set 和 get 方法?(封装的好处)
直接将字段暴露为 public 是非常危险的,因为它破坏了封装性,使用 private 字段配合 public 的 set/get 方法有以下核心优势:
- 数据隐藏: 类的内部实现细节被隐藏起来,外部代码无法直接访问和修改数据,只能通过提供的方法进行操作。
- 数据验证: 在
set方法中,你可以添加逻辑来确保数据的有效性,年龄不能为负数,用户名不能为空等。 - 控制访问: 你可以决定哪些字段可以被修改,哪些字段是只读的(只提供
get方法,不提供set方法)。 - 灵活性: 未来如果需要修改字段的存储方式或计算逻辑,你只需要修改
set和get方法的内部实现,而不需要修改所有调用这些方法的代码,你可能想把String类型的name改成两个字段firstName和lastName,但对外提供的getName()方法仍然返回一个完整的名字。 - 附加功能: 在
set方法中,除了设置值,你还可以触发其他操作,比如更新UI界面、记录日志、或者在值改变时通知其他对象等。
set 和 get 方法的命名和语法规范
Java社区(特别是通过JavaBeans规范)对 set 和 get 方法有非常明确的约定:
Getter 方法
- 方法名以
get开头。 - 后面紧跟首字母大写的字段名。
- 返回类型与字段的类型相同。
- 对于布尔类型的字段,可以使用
is作为前缀,isActive()而不是getActive(),但这两种方式都存在,get更通用。
Setter 方法
- 方法名以
set开头。 - 后面紧跟首字母大写的字段名。
- 返回类型为
void。 - 接收一个参数,参数类型与字段的类型相同,参数名就是字段名(通常带
a前缀或直接用小写)。
代码示例
让我们通过一个 Student 类来具体说明。

示例1:基础的 set 和 get
public class Student {
// 1. 将字段设为 private,实现数据隐藏
private String name;
private int age;
private boolean isActive;
// 2. 提供 public 的 Getter 和 Setter 方法
// Getter for name
public String getName() {
return this.name;
}
// Setter for name
public void setName(String name) {
this.name = name;
}
// Getter for age
public int getAge() {
return this.age;
}
// Setter for age (可以加入数据验证)
public void setAge(int age) {
// 验证年龄是否在合理范围内
if (age > 0 && age < 120) {
this.age = age;
} else {
System.out.println("Invalid age provided. Age not set.");
}
}
// Getter for isActive (使用 is 前缀)
public boolean isActive() {
return this.isActive;
}
// Setter for isActive
public void setActive(boolean active) {
this.isActive = active;
}
}
如何使用这个类?
public class Main {
public static void main(String[] args) {
// 创建一个 Student 对象
Student student1 = new Student();
// 使用 Setter 方法设置值
student1.setName("Alice");
student1.setAge(20);
student1.setActive(true);
// 使用 Getter 方法获取值
System.out.println("Student Name: " + student1.getName()); // 输出: Student Name: Alice
System.out.println("Student Age: " + student1.getAge()); // 输出: Student Age: 20
System.out.println("Is Active: " + student1.isActive()); // 输出: Is Active: true
// 尝试设置一个无效的年龄
student1.setAge(-5); // 输出: Invalid age provided. Age not set.
System.out.println("Student Age after invalid attempt: " + student1.getAge()); // 输出: Student Age after invalid attempt: 20
}
}
现代Java中的 set 和 get:Lombok
手动为每个字段编写 getter 和 setter 是非常重复和繁琐的工作,为了解决这个问题,一个非常流行的库 Lombok 应运而生。
Lombok 通过注解,在编译时自动为你的类生成 getter、setter、toString()、equals()、hashCode() 等样板代码。
使用 Lombok 的 Student 类
import lombok.Getter;
import lombok.Setter;
@Getter // 为所有 private 字段生成 Getter
@Setter // 为所有 private 字段生成 Setter
public class StudentLombok {
private String name;
private int age;
private boolean isActive;
// 你仍然可以自定义一些方法,比如带验证的 setAge
public void setAge(int age) {
if (age > 0 && age < 120) {
this.age = age;
} else {
System.out.println("Invalid age provided. Age not set.");
}
}
}
注意: 当你使用 @Getter 和 @Setter 时,Lombok 会生成所有字段的访问器,但如果你像上面的例子一样,手动编写了一个 setAge 方法,Lombok 会尊重你的手动实现,只为 name 和 isActive 生成 setter,而 age 的 setter 则使用你自定义的那个带验证的逻辑。
使用 Lombok 的 Main 类
public class Main {
public static void main(String[] args) {
StudentLombok student = new StudentLombok();
// 使用 Lombok 生成的 Setter
student.setName("Bob");
student.setAge(25);
// 使用 Lombok 生成的 Getter
System.out.println("Student Name: " + student.getName()); // 输出: Student Name: Bob
System.out.println("Student Age: " + student.getAge()); // 输出: Student Age: 25
student.setAge(-1); // 输出: Invalid age provided. Age not set.
}
}
如何使用Lombok:

- 在你的
pom.xml(Maven) 或build.gradle(Gradle) 文件中添加 Lombok 依赖。 - 在你的 IDE (如 IntelliJ IDEA 或 Eclipse) 中安装 Lombok 插件。
- 在类上使用
@Getter,@Setter,@Data(同时包含get, set, toString等) 等注解。
| 特性 | 手动编写 set/get |
使用 Lombok |
|---|---|---|
| 优点 | - 代码清晰,易于理解底层原理 - 可以对每个方法进行完全自定义(如复杂验证) |
- 大幅减少样板代码 - 提高开发效率 - 代码更简洁 |
| 缺点 | - 代码冗长,重复性高 - 维护成本高(修改字段名需同步修改方法) |
- 引入外部依赖 - 需要配置IDE和构建工具 - 初学者可能不理解其背后的原理 |
| 适用场景 | - 学习阶段,理解封装 - 项目不允许使用第三方库 - 需要对访问方法进行非常精细和复杂的控制 |
- 绝大多数现代Java项目 - 快速开发和迭代 - 团队成员都熟悉Lombok |
核心要点:set 和 get 方法是实现封装的关键手段,它们保护了对象的内部状态,提供了数据验证和灵活性的可能,虽然手动编写很繁琐,但理解其原理至关重要,在实际开发中,Lombok 等工具极大地简化了这一过程。
