与Eager相比,使用惰性初始化有什么好处吗?

时间:2020-07-22 11:31:53

标签: kotlin lazy-initialization

何时使用延迟初始化,以及何时使用Eager(即使我们进行延迟),我们将使用的变量仍将包含一些与以下任务关联的数据。那么我们如何在两者之间进行选择?两者之间在性能和内存效率上有什么区别吗?

请解释任何最佳用例,因为某些线程支持渴望而有些懒惰。

2 个答案:

答案 0 :(得分:1)

通常,延迟加载的优点是:

  • 如果您永远不需要该值,则无需在加载或存储它时付出任何速度或内存上的代价。
  • 启动速度更快。

缺点是:

  • 第一次使用该值时,必须等待其加载。
  • 以线程安全的方式访问该字段通常会产生少量开销。 (这是必需的,因为您通常不希望两个不同的线程执行两次加载;在任何情况下,您都不希望任何线程看到部分加载的数据。)

在其他语言中,另一个缺点是需要额外的代码来实现最后一点,但是K​​otlin的by lazy使其非常容易!

显然,总体收益取决于您根本需要多少价值,以及与以后相比,启动延迟的影响。

答案 1 :(得分:0)

我们应该在这里讨论的第一件事是什么是延迟加载和渴望加载:

快速加载是一种设计模式,其中的数据初始化在现场进行 延迟加载是一种设计模式,用于尽可能延迟对象的初始化 让我们来看一些示例的实际效果:

UserLazy类:

const [{ fetching, data, error }, reExecute] = useQuery({
  query: INITIAL_CONFIG_QUERY,
  pause: true
});

React.useEffect(() => {
  reExecute();
}, []);

OrderDetail类:

@Entity
@Table(name = "USER")
public class UserLazy implements Serializable {
 
    @Id
    @GeneratedValue
    @Column(name = "USER_ID")
    private Long userId;
 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private Set<OrderDetail> orderDetail = new HashSet();
 
    // standard setters and getters
    // also override equals and hashcode
 
}

一个用户可以拥有多个OrderDetails。在急切的加载策略中,如果加载用户数据,它还将加载与其关联的所有订单,并将其存储在内存中。

但是,当启用延迟加载时,如果我们拉起UserLazy,则在未显式调用之前,OrderDetail数据不会被初始化并加载到内存中。

在下一部分中,我们将看到如何在Hibernate中实现上述示例。

在此处查找文章: https://www.baeldung.com/hibernate-lazy-eager-loading

还请阅读以下内容: https://www.imperva.com/learn/performance/lazy-loading/