面试题答案
一键面试- 定义内联函数和泛型实化
- 首先,定义一个用于注册依赖的内联函数。通过泛型实化获取实际类型。
inline fun <reified T> registerDependency(factory: () -> T) { // 这里可以将factory存储到一个全局的依赖容器中 DependencyContainer.register(T::class, factory) }
- 然后,定义一个用于获取依赖的内联函数。同样使用泛型实化。
inline fun <reified T> getDependency(): T { return DependencyContainer.get(T::class) as T }
- 依赖容器设计
- 创建一个
DependencyContainer
类来管理依赖。它可以是一个单例。
object DependencyContainer { private val dependencies = mutableMapOf<KClass<*>, () -> Any>() fun register(kClass: KClass<*>, factory: () -> Any) { dependencies[kClass] = factory } fun get(kClass: KClass<*>): Any? { return dependencies[kClass]?.invoke() } }
- 创建一个
- 生命周期管理
- 单例模式:对于需要单例的依赖,可以在获取依赖时进行缓存。
inline fun <reified T> registerSingletonDependency(factory: () -> T) { var instance: T? = null registerDependency { if (instance == null) { instance = factory() } instance!! } }
- 其他生命周期:
- 短暂生命周期:每次调用
getDependency
时都创建新实例,如前面普通的registerDependency
方式。 - 自定义生命周期:可以引入一个生命周期管理接口,例如
DependencyLifecycle
,不同的依赖实现该接口,在接口方法中实现自己的生命周期逻辑,如初始化、销毁等。
- 短暂生命周期:每次调用
注册依赖时,工厂方法返回实现了interface DependencyLifecycle { fun onInit() fun onDestroy() }
DependencyLifecycle
接口的实例。在容器中可以在适当的时机(如应用关闭时)调用onDestroy
方法。