这一代理通过调用 LazyKt.lazy()
函数,并传入您定义的 lambda 表达式与线程安全模式参数来进行初始化:
this.fullname$delegate = LazyKt.lazy((Function0)(new Function0() {
@NotNull
public final String invoke() {
return name + lastname;
}
}));
让我们来观察 lazy() 的源码。由于 lazy()
函数默认使用 LazyThreadSafetyMode.SYNCHRONIZED
参数,因此它将返回一个 SynchronizedLazyImpl
类型的 Lazy 对象:
public actual fun lazy(initializer: () -> T): Lazy =
SynchronizedLazyImpl(initializer)
当属性代理第一次被访问时,SynchronizedLazyImpl
的 getValue()
函数就会被调用,这个函数将会在一个 synchronized
块中对属性进行初始化:
override val value: T
get() {
val _v1 = _value
if (_v1 !== UNINITIALIZED_VALUE) {