17

在 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();
}
4

2 回答 2

36

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

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

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

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

如果 delegate 是之前调用 memoize 创建的实例,则直接返回。

于 2012-12-01T21:27:40.487 回答
2

Apache Commons Lang 有一个LazyInitializer

于 2013-11-08T17:47:30.313 回答