延迟属性

  1. val p: String by lazy {
  2. // 计算该字符串
  3. }

利用Lazy帮助实现初始化

lazy() 是一个函数, 接受一个 Lambda 表达式作为参数, 返回一个 Lazy 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lamda 表达式并记录结果, 后续调用 get() 只是返回记录的结果。 先贴上代码:

  1. fun startInit(component: Components.()->Unit){
  2. component.invoke(Components.get())
  3. }
  4. class Components {
  5. companion object{
  6. private val entry = ArrayMap<String,Any?>()
  7. private val instant by lazy { Components() }
  8. fun get() = instant
  9. fun getEntry() = entry
  10. }
  11. inline fun <reified T>single(single: ()->T){
  12. val name = T::class.java.name
  13. getEntry()[name] = single()
  14. }
  15. }
  16. inline fun <reified T> get(name: String = T::class.java.name) : T{
  17. return Components.getEntry()[name] as T
  18. }
  19. inline fun <reified T> inject(name: String = T::class.java.name) : Lazy<T> {
  20. return lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { Components.getEntry()[name] as T }
  21. }
  22. // 使用例子
  23. startInit {
  24. single { RoomApi.getDao() }
  25. single { RetroHttp.createApi(Main::class.java) }
  26. }
  27. private val main : Main by inject()
  28. private val dao : MainDao by inject()
  29. 复制代码

总结:简单的代码优化,提高开发效率