POJO,JavaBeans,DTO和VO之间的区别

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.Integerjava.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 上找到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值