我在我的java应用程序中使用简单的Supplier / Optional'子类'实现了Lazy Loading。
我的课程:User
和Order
,其中一个用户有多个订单
这个类看起来像这样:
public class Lazy<T> {
private Optional<T> instance = Optional.empty();
private final Supplier<T> supplier;
public Lazy(Supplier<T> theSupplier) {
supplier = theSupplier;
}
public T get() {
if (!instance.isPresent()) {
instance = Optional.of(supplier.get());
}
return instance.get();
}
我用以下内容初始化它:
Lazy<List<Order>> lazyOrders = new Lazy<>(() -> {
List<Order> orders = null;
orders = parent.getOrders();
return orders;
});
在用户类中,lazy的使用如下所示:private Lazy<List<Order>> orders
在getter中我使用orders.get()
问题是由于!instance.isPresent()
,一旦加载了orders属性(通过调用get),它就永远不会被加载
如果我使用getOrders()
然后向我的数据库添加更多订单并再次调用getOrders()
,这将成为一个问题,它只会返回旧状态。
我可以删除isPresent
并在每次调用getter
时加载它,但我想也许有人有更好的解决方案。