1. 概述
在本教程中,我们将学习什么是数据传输对象(DTO),值对象(VO),普通旧Java对象(POJO)和JavaBeans。我们将查看它们之间的差异,并了解使用哪种类型以及何时使用。
2. 普通的旧 Java 对象
POJO,也称为普通旧Java对象,是一个普通的Java对象,没有对任何特定框架的引用。这是一个术语,用于指代简单、轻量级的 Java 对象。
POJO 不对属性和方法使用任何命名约定。
让我们定义一个基本的EmployeePOJO对象,该对象具有三个属性:
public class EmployeePOJO {
private String firstName;
private String lastName;
private LocalDate startDate;
public EmployeePOJO(String firstName, String lastName, LocalDate startDate) {
this.firstName = firstName;
this.lastName = lastName;
this.startDate = startDate;
}
public String name() {
return this.firstName + " " + this.lastName;
}
public LocalDate getStart() {
return this.startDate;
}
}
如我们所见,上面的Java对象定义了表示员工的结构,并且不依赖于任何框架。
3. 爪哇豆
3.1. 什么是JavaBean?
JavaBean主要类似于POJO,对如何实现它有一些严格的规则。
这些规则指定它应该是可序列化的,具有空构造函数,并允许使用遵循getX() 和setX() 约定的方法访问变量。
3.2. POJO 作为 JavaBean
由于JavaBean本质上是一个POJO,让我们通过实现必要的Bean规则将EmployeePOJO转换为JavaBean:
public class EmployeeBean implements Serializable {
private static final long serialVersionUID = -3760445487636086034L;
private String firstName;
private String lastName;
private LocalDate startDate;
public EmployeeBean() {
}
public EmployeeBean(String firstName, String lastName, LocalDate startDate) {
this.firstName = firstName;
this.lastName = lastName;
this.startDate = startDate;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
// additional getters and setters
}
在这里,为了将 POJO 转换为 JavaBean,我们实现了Serializable接口,将属性标记为私有,并使用 getter/setter 方法来访问属性。
4. DTO
4.1. DTO模式
DTO(也称为数据传输对象)封装值以在进程或网络之间传输数据。
这有助于减少调用的方法数量。通过在单个调用中包含多个参数或值,我们减少了远程操作中的网络开销。
此模式的另一个优点是序列化逻辑的封装。它允许程序以特定格式存储和传输数据。
DTO 没有任何显式行为。它基本上有助于通过将领域模型与表示层分离来松散耦合代码。
4.2. 如何使用 DTO?
DTO 具有扁平结构,没有任何业务逻辑。它们使用与 POJO 相同的格式。DTO 仅包含与序列化或分析相关的存储、访问器和方法。
DTO 基本上映射到域模型,从而将数据发送到方法或服务器。
让我们创建EmployeeDTO,它将创建员工所需的所有详细信息分组。我们将在单个请求中将此数据发送到服务器,以优化与 API 的交互:
public class EmployeeDTO {
private String firstName;
private String lastName;
private LocalDate startDate;
// standard getters and setters
}
上述DTO与不同的服务交互并处理数据流。此 DTO 模式可用于任何服务,没有任何框架限制。
5. VO
VO,也称为值对象,是一种特殊类型的对象,可以保存诸如java.lang.Integer和java.lang.Long之类的值。
VO 应始终覆盖equals() 和hashCode() 方法。VO 通常封装小对象,例如数字、日期、字符串等。它们遵循值语义,即它们直接更改对象的值并传递副本而不是引用。
最好使值对象不可变。值的更改仅通过创建新对象而不是更新旧对象本身中的值来发生。这有助于理解创建的两个值对象应保持相等的隐式协定。
让我们定义EmployeeVO并覆盖equals() 和hashCode() 方法:
public class EmployeeVO {
private String firstName;
private String lastName;
private LocalDate startDate;
public EmployeeVO(String firstName, String lastName, LocalDate startDate) {
this.firstName = firstName;
this.lastName = lastName;
this.startDate = startDate;
}
// Getters
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
EmployeeVO emp = (EmployeeVO) obj;
return Objects.equals(firstName, emp.firstName)
&& Objects.equals(lastName, emp.lastName)
&& Objects.equals(startDate, emp.startDate);
}
@Override
public int hashCode() {
return Objects.hash(firstName, lastName, startDate);
}
}
6. 结论
在本文中,我们看到了POJO,JavaBeans,DTO和Value Objects的定义。我们还看到了一些框架和库如何利用JavaBean命名约定,以及如何将POJO转换为JavaBean。我们还查看了 DTO 模式和值对象以及它们在不同场景中的用法。
与往常一样,这些示例的代码可在GitHub 上找到。