Lazy Loading in Java

2025 年 5 月 8 日 | 阅读 5 分钟

延迟加载(lazy loading)是指在需要使用某个对象时才创建该对象的概念。换句话说,它是指在需要时才实例化类的过程。当创建对象的成本很高,或者在程序中很少使用某个对象时,延迟加载就显得尤为重要。延迟加载是一种能够提高程序效率的技术。在本节中,我们将详细讨论延迟加载

延迟加载的实现

虚拟代理

虚拟代理是一种节省内存的进程,它促进了对象创建的推迟。请看以下程序。

文件名: LazyLoadingExample.java

输出

Company Name: ABC
Company Address: India
Company Contact No.: +91-011-55512347

Requesting for the contact list ...
Fetching the list of employees ... 

Employee Name: Mukesh, EmpDesignation : JSE, Employee Salary : 3452.67
Employee Name: Amit, EmpDesignation : ASE, Employee Salary : 22345.0
Employee Name: Naman, EmpDesignation : G4, Employee Salary : 3256.17
Employee Name: Vipul, EmpDesignation : SDE1, Employee Salary : 4895.34
Employee Name: Akhil, EmpDesignation : SDE2, Employee Salary : 2857.91

说明: 在代码中,我们实例化了 ContactListProxy 类。此时,员工列表尚未创建。这是因为此时并不需要员工列表。当需要员工列表时,将调用 getEmployeeList() 方法,同时创建员工列表,这表明员工列表的创建被推迟到需要时才进行。

延迟初始化

延迟初始化(Lazy Initialization)技术演示了在需要使用类字段时才检查其值。如果该类字段的值为 null,则在返回之前会用正确的值更新该字段。以下示例对此进行了说明。

文件名: LazyLoadingExample1.java

输出

The number of instances created = 1
Mercedes

The number of instances created = 2
Audi
Mercedes

The number of instances created = 3
Audi
BMW
Mercedes

说明: 在代码中,getCarByTypeName() 方法进行了 Map 字段的延迟初始化。它首先检查是否包含所请求的汽车类型。如果不存在,则实例化相关的汽车类型,然后将其加载到 Map 中。请注意,Cars 类的构造函数被有意设为私有。私有构造函数确保了任何时候都无法创建 Cars 类的对象。只有当我们调用 getCarByTypeName() 方法时,才会创建 Cars 类的实例,这表明 Cars 类的适当实例仅在需要时才创建或加载。