如何在Java中使用Ghost对象实现延迟加载?

问题描述 投票:0回答:1

我已经阅读了马丁·福勒(Martin Fowler)的书中有关延迟加载的章节。

作者提供了我不知道的通过C#上的Ghost对象进行延迟加载的示例。我试图理解整体含义,但是我没有成功,因为其中涉及很多课程,并且本书没有足够的理解力。我也尝试使用Google搜索示例,但是我发现的所有地方都将我链接到了我也不知道的PHP示例。

您能提供有关Java的示例吗?

java architecture lazy-loading
1个回答
0
投票

如果我理解您的要求是正确的(我在看https://www.martinfowler.com/eaaCatalog/lazyLoad.html,那么我不知道一种直接在Java中获得此功能的方法;您将不得不使用其他原理之一,并将其​​包装在ghost对象包装器中。

基本上,您使用最小的一组值初始化对象,然后仅在必要时才计算其他字段值。类似于下面的代码,您可以通过一种懒惰的方式从Complicated中获取Ghost对象。我已经看到从数据库加载信息时使用了这样的对象,但不知道何时需要它,或者不知道何时计算特别复杂或重量级的哈希码。

public class Ghost {

    private final int count;
    private boolean initialized = false;
    private Complicated complicated = null;

    public Ghost(int count) {
        this.count = count;
    }

    public Complicated getComplicated(String extraValue) {
        // could also check (here and below) this.complicated == null
        // in that case doExpensiveOperation should not return null, and there shouldn't be other fields to initialize
        if (!initialized) {
            synchronized(this) { // if you want concurrent access
                if (!initialized) {
                    complicated = doExpensiveOperation(extraValue);
                    initialized = true;
                }
            }
        }

        return complicated;
    }

    private Complicated doExpensiveLoad(String extraValue) {
        // do expensive things with this.count and extraValue
        // think database/network calls, or even hashcode calculations for big objects
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.