Java中对象水合Hydrate是什么?

Java 中的对象是使用new关键字创建的类的实例。对象是程序的构建块,对象与其他对象交互以实现所需的功能。 

对象通常意味着在面向对象的编程范式中表示现实世界的实体,因此,对象具有多个关联的属性。这些属性值需要填充,填充通常再对象初始化时期实施,但是也有不是在初始化阶段。

用真实数据填充对象属性的过程:

  • 通常是通过调用类构造函数并将数据作为参数传递来完成的。
  • 可以从数据源(例如网络、数据库或文件系统)完成。 
  • 有时,填充对象属性可能是一项资源密集型操作,尤其是当数据从不同的数据源馈送时。

在这种情况下,最好将对象属性填充尽可能推迟到需要的时候。这种模式称为延迟初始化.

因为我们一次使用空数据创建对象,并在将来使用相关数据延迟填充该对象。有意识地延迟数据初始化有助于提高代码性能和内存利用率。

让我们创建一个具有几个属性的User类:

public class User {
    private String uId;
    private String firstName;
    private String lastName;
    private String alias;
    // constructor, getter-setters
}

我们可以创建一个User对象并将其保存在内存中,而无需用有意义的数据填充其属性:
User iamUser = new User();

水合hydration定义
通过延迟初始化,我们故意延迟已经创建并存在于内存中的对象的初始化过程。将数据填充到现有空对象的过程称为水化hydration。

我们创建的 User 实例是一个虚拟实例。该对象没有任何相关的数据属性,因为直到此时才需要它。为了使对象有用,我们应该用相关领域数据填充对象,这可以通过用来自网络、数据库或文件系统等源的数据填充来完成。 

public void generateMyUser() {
    this.setAlias("007");
    this.setFirstName(
"James");
    this.setLastName(
"Bond");
    this.setuId(
"JB");
}

现在我们创建一个空的User实例,并在需要时通过调用generateMyUser()方法来水合同一实例:

User jamesBond = new User();
// performing hydration
jamesBond.generateMyUser();

反序列化
反序列化是编程中用于从序列化形式恢复或重新创建对象的过程。

水合和反序列化都涉及处理对象并用数据填充它。然而,两者之间的重要区别在于,

  • 反序列化主要是创建实例和填充属性的单步过程。
  • 另一方面,水合只涉及将数据添加到预先形成的对象的属性中。

因此,反序列化是在同一步骤中进行对象实例化和对象水化。 

ORM 框架中的水合
对象水合的想法在 ORM 框架中更为普遍,例如 Hibernate 或JPA。

框架通常通过调用类的默认构造函数来初始化一个空对象。 一旦对象准备就绪,框架就会尝试从缓存存储中加载属性数据。如果此时存在缓存未命中,框架将与数据库建立连接并查询表以获取行。