在 java 中实现一个惰性供应商

2022-09-02 23:51:08

在Java中实现懒惰的供应商的正确范式或实用程序类(似乎找不到预先存在的类)是什么?

我希望有一些东西来处理一次性计算/稍后缓存行为,并允许我独立指定计算行为。我知道这可能有一个错误,但它有正确的语义:

abstract public class LazySupplier<T> implements Supplier<T> 
{
    private volatile T t;
    final private Object lock = new Object();

    final public T get() {
        if (t == null)
        {
            synchronized(lock)
            {
                if (t == null)
                    t = compute();
            }
        }
        return t;
    }
    abstract protected T compute();
}

答案 1

这已经在 Suppliers.memoize 方法中实现。

public static <T> Supplier<T> memoize(Supplier<T> delegate)

返回一个供应商,该供应商缓存在第一次调用 get() 期间检索到的实例,并在后续调用 get() 时返回该值。请参见: 备忘录

返回的供应商是线程安全的。委托的 get() 方法最多调用一次。供应商的序列化表单不包含缓存的值,当在重新序列化的实例上调用 get() 时,将重新计算缓存的值。

如果委托是由先前调用 memoize 创建的实例,则直接返回该实例。


答案 2

Apache Commons Lang有一个LazyInitializer