gpt4 book ai didi

java - 懒加载引用实现

转载 作者:搜寻专家 更新时间:2023-10-30 21:16:48 24 4
gpt4 key购买 nike

Guava 的 computing map feature 给我留下了深刻的印象,我正在寻找一种“计算引用”——一种与 Guava 的易用性并行的延迟加载引用实现,我的意思是它处理所有锁定、加载和异常处理引擎盖,只公开一个 get() 方法。

经过简短的搜索后一无所获,我迅速推出自己的产品作为概念证明:

public abstract class ComputingRef<T> implements Callable<T> {

private volatile T referent = null;
private Lock lock = new ReentrantLock();

public T get() {
T temp = referent;
if (temp == null) {
lock.lock();
try {
temp = referent;
if (temp == null) {
try {
referent = temp = call();
}
catch (Exception e) {
if (e instanceof RuntimeException) {
throw (RuntimeException)e;
}
else {
throw new RuntimeException(e);
}
}
}
}
finally {
lock.unlock();
}
}
return temp;
}
}

这个 ComputingRef 可以匿名扩展以实现 call(),它作为工厂方法:

ComputingRef<MyObject> lazySingletonRef = new ComputingRef<MyObject>() {
@Override
public MyObject call() {
//fetch MyObject from database and return
}
};

我不满意这个实现是最优的,但它展示了我所追求的。

后来我找到了 this example from the T2 Framework ,它看起来更复杂。

现在我的问题是:

  • 如何改进我的上述代码?
  • 它与 T2 示例相比如何,该示例的复杂性更高有哪些优势?
  • 是否有我在搜索中遗漏的延迟加载引用的其他实现?

编辑:按照 @irreputable's answer 的建议更新我的实现以使用局部变量 - 如果您觉得上面的示例有用,请点赞。

最佳答案

参见 Suppliers.memoize(Supplier)延迟初始化一个值。

关于java - 懒加载引用实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7524423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com