gpt4 book ai didi

java - 在惰性初始化供应商中引用 "this"?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:45:38 38 4
gpt4 key购买 nike

对于业务决策应用程序,我遇到过很多情况,在这些情况下,我必须使用惰性初始化来缓存昂贵的值。因此,我利用泛型和 Supplier lambda 来封装惰性初始化。

import java.util.function.Supplier;

public final class LazyProperty<T> {
private final Supplier<T> supplier;
private volatile T value;

private LazyProperty(Supplier<T> supplier) {
this.supplier = supplier;
}
public T get() {
if (value == null) {
synchronized(this) {
if (value == null) {
value = supplier.get();
}
}
}
return value;
}

public static <T> LazyProperty<T> forSupplier(Supplier<T> supplier) {
return new LazyProperty<T>(supplier);
}
}

但我希望在创建对象之前无法初始化属性的情况下也能够使用它,因为对象只能在创建后计算该属性(通常需要自身的上下文或其他物体)。但是,这通常需要在供应商函数中引用 this

public class MyClass {
private final LazyProperty<BigDecimal> expensiveVal =
LazyProperty.forSupplier(() -> calculateExpensiveVal(this));

public BigDecimal getExpensiveVal() {
return expensiveVal.get();
}
}

只要我能保证 LazyProperty 的 get() 函数仅在构造 MyClass 之后调用(通过 getExpensiveVal() 方法) ),由于供应商中的 this 引用,不应该有任何部分构造问题,对吗?

最佳答案

根据您展示的小代码,您应该没有任何问题,但我可能会像这样编写您的类(class)以更明确:

public class MyClass {
private final LazyProperty<BigDecimal> expensiveVal;

public MyClass() {
this.expensiveVal = LazyProperty.forSupplier(() -> calculateExpensiveVal(MyClass.this));
}

public BigDecimal getExpensiveVal() {
return expensiveVal.get();
}
}

关于java - 在惰性初始化供应商中引用 "this"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27784767/

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