Generated with sparks and insights from 56 sources

img6

img7

img8

img9

img10

img11

Introduction

  • SharedPreferences读写委托: 使用Kotlin的属性委托语法糖简化SharedPreferences的读写操作,提升代码简洁性和可维护性。

  • Lifecycle委托: 在Android生命周期管理中,通过委托机制将组件的生命周期状态委托给LifecycleOwner对象,简化生命周期管理。

  • 属性委托: 使用Kotlin的属性委托将属性的访问和修改委托给另一个对象,减少重复代码,提高代码可读性。

  • 延迟初始化: 使用lazy关键字实现延迟初始化,只有在第一次访问时才会初始化对象,提升性能。

  • 观察者委托: 使用observable和vetoable委托监听属性值的变化,便于在属性赋值过程中进行拦截和处理。

  • Map委托: 将属性的值委托给Map实例,实现属性与Map键值对的映射,简化数据存储和访问。

  • 接口委托: 将接口的实现委托给另一个对象,减少重复代码,并将实现与接口分离。

  • 类委托: 将一个类的实现委托给另一个类,实现复杂功能如代理对象的缓存和线程安全。

SharedPreferences委托 [1]

  • 定义: 使用Kotlin的属性委托语法糖简化SharedPreferences的读写操作。

  • 实现: 通过SPDelegates类实现ReadWriteProperty接口,委托getValue和setValue方法。

  • 示例: 在SpBase单例类中定义SP存储项,使用by关键字将读写操作委托给SPDelegates对象。

  • 优点: 提升代码简洁性和可维护性,减少模板代码。

  • 参考代码: 'var contentSomething: String by SPDelegates(CONTENT_SOMETHING, "我是一个 SP 存储项,点击编辑我")'

img6

img7

img8

img9

img10

img11

Lifecycle委托 [2]

  • 定义: 通过委托机制将组件的生命周期状态委托给LifecycleOwner对象。

  • 实现: 使用LifecycleOwner对象管理组件的生命周期,避免手动管理生命周期带来的麻烦和错误。

  • 示例: 在Activity中将Activity对象作为LifecycleOwner对象,并将其传递给需要注册生命周期的组件。

  • 优点: 简化生命周期管理,提高代码可维护性。

  • 参考代码: 'mOwner?.lifecycle?.addObserver(this)'

img6

img7

img8

img9

img10

img11

属性委托 [3]

  • 定义: 将属性的访问和修改委托给另一个对象。

  • 实现: 使用ReadOnlyProperty或ReadWriteProperty接口实现属性委托。

  • 示例: 'var myProperty: String by MyDelegate()'

  • 优点: 减少重复代码,提高代码可读性。

  • 参考代码: 'operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return "Hello from delegate!" }'

img6

img7

img8

img9

img10

img11

延迟初始化 [3]

  • 定义: 使用lazy关键字实现延迟初始化,只有在第一次访问时才会初始化对象。

  • 实现: lazy关键字接收一个lambda表达式,最后一行代表返回值。

  • 示例: 'val name: String by lazy { "abc123" }'

  • 优点: 提升性能,避免不必要的初始化。

  • 参考代码: 'val lazyProperty: String by lazy { println("Initializing lazy property") "Hello from lazy property!" }'

img6

img7

img8

img9

img10

img11

观察者委托 [2]

  • 定义: 使用observable和vetoable委托监听属性值的变化。

  • 实现: observable委托在属性赋值后执行处理程序,vetoable委托在属性赋值前决定是否使用新值。

  • 示例: 'var values: String by Delegates.observable("默认值") { property, oldValue, newValue -> println("$oldValue -> $newValue ") }'

  • 优点: 便于在属性赋值过程中进行拦截和处理。

  • 参考代码: 'var age: Int by Delegates.vetoable(18) { property, oldValue, newValue -> newValue > oldValue }'

img6

img7

img8

img9

img10

img11

Map委托 [2]

  • 定义: 将属性的值委托给Map实例,实现属性与Map键值对的映射。

  • 实现: 使用Map实例存储属性的值,属性名与Map键名一致。

  • 示例: 'class Member(private val map: Map<String, Any>) { val name: String by map val age: Int by map }'

  • 优点: 简化数据存储和访问。

  • 参考代码: 'val member = Member(mapOf("name" to "guanyu", "age" to 36, Pair("dob", 1234567890L)))'

img6

img7

img8

img9

img10

接口委托 [3]

  • 定义: 将接口的实现委托给另一个对象。

  • 实现: 使用by关键字将接口的实现委托给另一个对象。

  • 示例: 'class MyOtherClass : MyInterface by MyDelegate()'

  • 优点: 减少重复代码,并将实现与接口分离。

  • 参考代码: 'class UserDelegate2(private val action: IUserAction) : IUserAction by action'

img6

img7

img8

img9

img10

img11

类委托 [1]

  • 定义: 将一个类的实现委托给另一个类。

  • 实现: 使用by关键字将类的实现委托给另一个类。

  • 示例: 'class Derived(b: Base) : Base by b'

  • 优点: 实现复杂功能如代理对象的缓存和线程安全。

  • 参考代码: 'class UserDelegate3(private val action: IUserAction) : IUserAction by action { override fun attack() { println("UserDelegate3 - 只重写了攻击") } }'

img6

img7

img8

<br><br>