set 和 get 方法是 Java 编程中一种极其普遍和重要的编码规范,它们共同构成了封装这一面向对象编程核心概念的实现方式。

核心概念:封装
在深入 set 和 get 之前,必须先理解封装。
封装 的思想是:将对象的属性(数据)和操作这些属性的方法捆绑在一起,并对外部世界隐藏对象的内部细节。
你可以把一个对象想象成一个带锁的黑盒子,使用者不需要知道盒子内部是如何工作的,只需要通过盒子提供的特定接口(比如钥匙孔,也就是 set 和 get 方法)来与盒子交互即可。
这样做的好处是:

- 数据安全:防止外部代码随意修改对象内部的状态。
- 代码维护性:我们可以随时修改内部实现,而不会影响到外部调用该对象的代码。
- 灵活性:可以在
set方法中加入逻辑,使属性的设置不仅仅是简单的赋值。
get 方法 的作用
get 方法,也称为访问器或getter,它的作用是获取对象的私有属性值。
主要作用:
-
提供受控的访问:将类的内部属性(字段)声明为
private,外部代码无法直接访问。get方法就像一个“只读”的窗口,允许外部代码在需要时获取该属性的值。 -
隐藏实现细节:调用
get方法时,你只需要知道方法名(如getName()),而不需要关心name这个变量在底层是如何存储的,也许name是从数据库里查出来的,或者经过复杂的计算,但这些都对调用者透明。
(图片来源网络,侵删)
示例:
public class Person {
// 1. 将属性声明为 private,实现隐藏
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 2. 提供 get 方法来获取私有属性
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
}
// 在另一个类中使用
public class Main {
public static void main(String[] args) {
Person person = new Person("张三", 30);
// 错误!无法直接访问私有属性
// String name = person.name; // 编译错误
// 正确!通过 get 方法获取值
String name = person.getName();
int age = person.getAge();
System.out.println("姓名: " + name); // 输出: 姓名: 张三
System.out.println("年龄: " + age); // 输出: 年龄: 30
}
}
set 方法 的作用
set 方法,也称为修改器或setter,它的作用是设置或修改对象的私有属性值。
主要作用:
-
提供受控的修改:外部代码不能直接给私有属性赋值,必须通过
set方法,这给了我们在赋值前进行校验和逻辑处理的机会。 -
数据校验:这是
set方法最重要的功能之一,我们可以在set方法中添加判断逻辑,确保赋给属性的值是合法的、有效的。 -
业务逻辑触发:当某个属性被修改时,可能需要触发一些其他的操作,修改了用户名,可能需要同时更新数据库、发送通知等,这些逻辑都可以放在
set方法中。
示例:
public class Student {
private String name;
private int score; // 分数
// ... 构造方法和 get 方法 ...
// 3. 提供 set 方法来修改私有属性,并加入校验逻辑
public void setName(String name) {
// 检查名字是否为空或空字符串
if (name == null || name.trim().isEmpty()) {
System.out.println("错误:姓名不能为空!");
// 可以选择抛出异常或直接不赋值
return;
}
this.name = name; // 只有校验通过才赋值
}
public void setScore(int score) {
// 检查分数是否在有效范围内
if (score < 0 || score > 100) {
System.out.println("错误:分数必须在 0 到 100 之间!");
return;
}
this.score = score;
// 可以在这里添加其他逻辑,比如更新平均分等
}
}
// 在另一个类中使用
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.setName("李四");
student.setScore(95);
System.out.println("学生姓名: " + student.getName()); // 输出: 学生姓名: 李四
System.out.println("学生分数: " + student.getScore()); // 输出: 学生分数: 95
// 尝试设置非法值
student.setName(""); // 输出: 错误:姓名不能为空!
student.setScore(150); // 输出: 错误:分数必须在 0 到 100 之间!
// 非法值没有被设置,所以属性保持原样
System.out.println("学生姓名: " + student.getName()); // 输出: 学生姓名: 李四
System.out.println("学生分数: " + student.getScore()); // 输出: 学生分数: 95
}
}
命名规范
Java 社区有一套非常严格的命名规范来统一 set 和 get 方法的风格:
get方法:- 方法名以
get开头。 - 后面紧跟属性名的首字母大写形式。
- 如果属性是
boolean类型,通常用is代替get(isActive()而不是getActive())。
- 方法名以
set方法:- 方法名以
set开头。 - 后面紧跟属性名的首字母大写形式。
- 方法参数类型与属性类型一致,参数名就是属性名(通常小写)。
- 方法名以
示例:
| 属性类型 | 属性名 | get 方法名 |
set 方法名 |
|---|---|---|---|
String |
userName |
getUserName() |
setUserName(String userName) |
int |
age |
getAge() |
setAge(int age) |
boolean |
isActive |
isActive() |
setActive(boolean isActive) |
double |
price |
getPrice() |
setPrice(double price) |
现代 Java 的演进:Lombok
虽然 set 和 get 方法非常重要,但手动编写它们非常繁琐且重复,为了解决这个问题,Lombok 库应运而生。
Lombok 通过注解,可以在编译时自动为你的类生成 getter、setter、toString()、equals()、hashCode() 等样板代码。
使用 Lombok 的示例:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Product {
private String id;
private String name;
private double price;
}
// 使用方式完全一样,但代码量大大减少
public class Main {
public static void main(String[] args) {
Product product = new Product();
product.setName("笔记本电脑");
product.setPrice(5999.99);
System.out.println("产品名称: " + product.getName()); // 输出: 产品名称: 笔记本电脑
System.out.println("产品价格: " + product.getPrice()); // 输出: 产品价格: 5999.99
}
}
注意:使用 Lombok 需要在你的 IDE(如 IntelliJ IDEA, Eclipse)中安装相应的插件,并且在构建工具(如 Maven 或 Gradle)中添加 Lombok 依赖。
| 特性 | get 方法 (Getter) |
set 方法 (Setter) |
|---|---|---|
| 核心作用 | 读取私有属性的值 | 修改私有属性的值 |
| 提供访问 | 提供对私有属性的只读访问 | 提供对私有属性的可控修改 |
| 主要优点 | 隐藏内部实现,保证数据不被随意读取 | 可以进行数据校验,防止非法值 |
| 附加逻辑 | 可以在返回前对数据进行处理(如格式化) | 可以在赋值后触发业务逻辑(如更新数据库) |
| 命名规范 | get + 属性名首字母大写 |
set + 属性名首字母大写 |
set 和 get 方法是 Java 封装思想的基石,它们虽然看起来简单,却是构建健壮、安全、可维护的面向对象应用程序的基石,在现代开发中,虽然 Lombok 等工具可以自动生成它们,但理解其背后的原理和重要性是每个 Java 程序员必备的技能。
