面试题答案
一键面试设计思路
- 定义委托类:创建不同的委托类来实现不同的延迟加载策略。每个委托类负责管理属性的加载逻辑。
- 使用委托属性:在数据模型类中,通过委托属性将属性的访问和加载逻辑委托给相应的委托类。
关键代码实现
- 首次使用时加载的委托类
class LazyLoadDelegate<T>(private val initializer: () -> T) {
private var value: T? = null
operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): T {
return value ?: initializer().also { value = it }
}
}
- 满足特定条件时加载的委托类
class ConditionalLazyLoadDelegate<T>(
private val initializer: () -> T,
private val condition: () -> Boolean
) {
private var value: T? = null
operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): T {
if (value == null && condition()) {
value = initializer()
}
return value ?: throw IllegalStateException("Property not initialized yet.")
}
}
- 数据模型类
class DataModel {
// 首次使用时加载的属性
val expensiveProperty1: String by LazyLoadDelegate {
// 模拟高成本加载操作
"Expensive value 1 loaded"
}
// 满足特定条件时加载的属性
val expensiveProperty2: String by ConditionalLazyLoadDelegate({
// 模拟高成本加载操作
"Expensive value 2 loaded"
}, {
// 特定条件
someCondition()
})
private fun someCondition(): Boolean {
// 实际的条件判断逻辑
return true
}
}
在上述代码中,LazyLoadDelegate
实现了首次使用时加载的策略,ConditionalLazyLoadDelegate
实现了满足特定条件时加载的策略。在 DataModel
类中,通过 by
关键字将属性委托给相应的委托类,从而实现不同的延迟加载需求。