1. 封装的概念与设计规范
1.1 什么是封装?
- 定义:
封装是面向对象编程的三大特征(封装、继承、多态)之一,指将数据(属性)和操作数据的方法(行为)捆绑在一个对象中,并控制对内部数据的访问权限。 - 核心目标:
- 隐藏对象的内部实现细节。
- 通过公开的接口安全地访问和修改数据。
1.2 封装的设计规范
原则:合理隐藏,合理暴露!!!
- 隐藏:通过
private修饰符限制对成员变量的直接访问。 - 暴露:通过
public修饰的getter和setter方法提供安全的数据操作接口。
代码示例:
public class Student {
// 隐藏成员变量(私有化)
private String name;
private int age;
private double chinese;
private double math;
// 暴露方法(公共接口)
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
// 数据校验:保证赋值合法性
if (age > 0 && age < 200) {
this.age = age;
} else {
System.out.println("年龄数据非法!");
}
}
public int getAge() {
return age;
}
// 其他业务方法
public void printTotalScore() {
System.out.println(name + "的总分是:" + (chinese + math));
}
}
1.3 如何控制成员的公开或隐藏?
| 修饰符 | 作用 | 适用范围 |
|---|---|---|
private | 隐藏成员,仅本类内可直接访问 | 成员变量、方法、构造器 |
public | 公开成员,所有地方均可访问 | 成员变量、方法、构造器 |
示例:
private int age; // 隐藏变量,外部无法直接访问
public int getAge() { // 公开方法,允许外部安全获取值
return age;
}
1.4 封装的优势
-
数据安全性:
- 通过
setter方法进行数据校验,避免非法赋值。
public void setAge(int age) { if (age < 0 || age > 150) { throw new IllegalArgumentException("年龄不合法!"); } this.age = age; } - 通过
-
代码可维护性:
- 内部实现细节修改不影响外部调用(如字段名变更、计算逻辑调整)。
-
接口统一性:
- 提供标准化的数据访问方式,便于扩展和协作。
1.5 实际开发规范
-
成员变量私有化:
- 所有成员变量默认使用
private修饰,禁止直接通过对象访问。
- 所有成员变量默认使用
-
提供公共访问方法:
- 通过
getXxx()获取值,通过setXxx()修改值。 - 根据业务需求选择性暴露方法(例如只读属性不提供
setter)。
- 通过
-
方法按需公开:
- 仅对外部需要调用的方法使用
public修饰,内部辅助方法使用private。
- 仅对外部需要调用的方法使用
2. 实体类的定义与应用
2.1 什么是实体类?
定义:
实体类是一种特殊的 Java 类,其核心职责是存储数据。它通过私有化成员变量并提供公共的访问方法,将数据与业务逻辑分离。
特点:
- 成员变量私有化:
所有成员变量必须使用private修饰,禁止直接访问。 - 公共的 getter/setter 方法:
通过public方法控制对成员变量的读写。 - 无参构造器:
必须显式定义无参构造器(默认构造器可能因有参构造器的定义而失效)。 - 数据与业务分离:
实体类仅负责存储数据,业务处理由其他类完成。
示例:
public class Student {
// 私有成员变量
private String name;
private double score;
// 无参构造器(必须显式定义)
public Student() {}
// 有参构造器(可选)
public Student(String name, double score) {
this.name = name;
this.score = score;
}
// getter/setter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
2.2 实体类的应用场景
核心场景:
- 数据存储与业务处理分离:
实体类对象仅保存数据,业务逻辑由其他类(如服务类、操作类)实现。
示例:
public class StudentOperator {
private Student student;
public StudentOperator(Student student) {
this.student = student;
}
// 业务方法:打印学生总分
public void printTotalScore() {
System.out.println("总分:" + student.getScore());
}
// 业务方法:判断是否及格
public void checkPass() {
if (student.getScore() >= 60) {
System.out.println(student.getName() + "及格!");
} else {
System.out.println(student.getName() + "不及格!");
}
}
}
// 使用示例
Student stu = new Student("张三", 85.5);
StudentOperator operator = new StudentOperator(stu);
operator.printTotalScore(); // 输出:总分:85.5
operator.checkPass(); // 输出:张三及格!
2.3 实体类的设计规范
- 成员变量私有化:
- 所有字段使用
private修饰,禁止直接通过对象访问。
- 所有字段使用
- 提供公共访问方法:
- 为每个字段提供
public的getXxx()和setXxx()方法。
- 为每个字段提供
- 显式定义无参构造器:
- 即使存在有参构造器,也必须手动添加无参构造器。
2.4 注意事项
- 框架依赖:
- 许多框架(如 Hibernate、Spring Data JPA)要求实体类必须有无参构造器。
- Lombok 简化代码:
- 使用
@Data注解(Lombok 库)可自动生成 getter/setter 和无参构造器。
import lombok.Data; @Data public class Student { private String name; private double score; } - 使用
- 数据校验:
- 可在
setter方法中加入数据校验逻辑,确保数据合法性。
public void setScore(double score) { if (score < 0 || score > 100) { throw new IllegalArgumentException("分数必须在 0-100 之间!"); } this.score = score; } - 可在
2.5 总结
- 核心作用:实体类是数据存储的标准化容器,与业务逻辑解耦。
- 设计原则:
- 私有化字段,通过公共方法控制访问。
- 显式定义无参构造器,避免框架兼容性问题。
- 应用价值:
- 提升代码可维护性,便于协作开发和功能扩展。
1101

被折叠的 条评论
为什么被折叠?



