MST

星途 面试题库

面试题:Kotlin委托属性在复杂业务场景下的延迟加载应用

假设你正在开发一个移动应用,有一个数据模型类,其中某些属性加载成本较高。在不同的业务场景中,这些属性可能需要不同的延迟加载策略(例如,有的在首次使用时加载,有的在满足特定条件时加载)。请使用Kotlin委托属性设计一套解决方案,满足这些不同的延迟加载需求,并详细说明你的设计思路和关键代码实现。
31.6万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义委托类:创建不同的委托类来实现不同的延迟加载策略。每个委托类负责管理属性的加载逻辑。
  2. 使用委托属性:在数据模型类中,通过委托属性将属性的访问和加载逻辑委托给相应的委托类。

关键代码实现

  1. 首次使用时加载的委托类
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 }
    }
}
  1. 满足特定条件时加载的委托类
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.")
    }
}
  1. 数据模型类
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 关键字将属性委托给相应的委托类,从而实现不同的延迟加载需求。