面试题答案
一键面试优化思路
- 缓存机制:通过属性委托,我们可以在第一次获取属性值后将其缓存起来,避免后续重复进行网络请求或数据库查询等耗时操作。
- 懒加载:仅在真正需要使用属性值时才进行获取,而不是在对象创建时就执行这些耗时操作。
- 分离关注点:将属性获取和缓存逻辑从业务代码中分离出来,提高代码的可维护性和可读性。
关键代码实现
- 定义属性委托类
class CachedValue<T>(private val provider: () -> T) {
private var cachedValue: T? = null
operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): T {
return cachedValue ?: provider().also { cachedValue = it }
}
}
fun <T> cachedValueOf(provider: () -> T): CachedValue<T> = CachedValue(provider)
- 在业务类中使用属性委托 假设业务模块涉及网络请求和数据库查询,以下以简单模拟为例:
class ComplexBusinessModule {
// 模拟网络请求
private fun fetchDataFromNetwork(): String {
// 实际实现中这里会进行网络请求
return "Data from network"
}
// 模拟数据库查询
private fun queryDataFromDatabase(): Int {
// 实际实现中这里会进行数据库查询
return 42
}
val networkData: String by cachedValueOf { fetchDataFromNetwork() }
val databaseData: Int by cachedValueOf { queryDataFromDatabase() }
}
- 使用示例
fun main() {
val module = ComplexBusinessModule()
// 第一次访问会执行网络请求或数据库查询,并缓存结果
println(module.networkData)
// 后续访问直接从缓存获取
println(module.networkData)
// 第一次访问会执行数据库查询,并缓存结果
println(module.databaseData)
// 后续访问直接从缓存获取
println(module.databaseData)
}
在上述代码中,CachedValue
类实现了属性委托,cachedValueOf
函数是一个方便的工厂函数。在 ComplexBusinessModule
类中,通过属性委托将 networkData
和 databaseData
的获取和缓存逻辑分离出来,提高了代码的可维护性和性能。每次访问属性时,如果缓存中没有值,则调用相应的提供函数(模拟网络请求或数据库查询),并将结果缓存起来供后续使用。