提示信息

kotlin 委托

不似经年 已关注

在 Kotlin 中,委托(Delegation)是一种设计模式,可以简化代码,并且通过复用现有类的功能来实现新的行为。Kotlin 提供了几种形式的委托:类委托、委托属性等。以下是对这两种委托方式的详细介绍:

类委托

类委托是 Kotlin 中的一项特性,允许一个类将接口中定义的方法实现委托给另一个对象。使用 by 关键字可以很容易地实现类委托。

示例:

  1. interface Speaker {
  2. fun speak()
  3. }
  4. class Person(val name: String) : Speaker {
  5. override fun speak() {
  6. println("Hello, my name is $name.")
  7. }
  8. }
  9. class Robot(val model: String) : Speaker {
  10. override fun speak() {
  11. println("Hi, I am a robot, model $model.")
  12. }
  13. }
  14. class CommunicationDevice(speaker: Speaker) : Speaker by speaker
  15. fun main() {
  16. val john = Person("John")
  17. val robot = Robot("RX-78")
  18. val device1 = CommunicationDevice(john)
  19. val device2 = CommunicationDevice(robot)
  20. device1.speak() // 输出: Hello, my name is John.
  21. device2.speak() // 输出: Hi, I am a robot, model RX-78.
  22. }

在这个例子中,CommunicationDevice 类通过 by speakerSpeaker 接口的方法实现委托给传入的 speaker 对象。

属性委托

属性委托是另一个强大的 Kotlin 特性,允许将属性的存储和访问行为交给另外一个对象来处理。最常用的属性委托是 lazyobservable

示例:lazy

lazy 是一个由 Kotlin 标准库提供的属性委托,适用于惰性初始化,即属性只在第一次访问时才会计算其值。

  1. val lazyValue: String by lazy {
  2. println("Computed!")
  3. "Hello"
  4. }
  5. fun main() {
  6. println(lazyValue) // 输出: Computed!\nHello
  7. println(lazyValue) // 输出: Hello
  8. }

示例:observable

observable 委托允许我们在值被改变时执行某些操作,比如监听属性的变化。

  1. import kotlin.properties.Delegates
  2. var observedValue: String by Delegates.observable("<no value>") { prop, old, new ->
  3. println("$old -> $new")
  4. }
  5. fun main() {
  6. observedValue = "First"
  7. // 输出: <no value> -> First
  8. observedValue = "Second"
  9. // 输出: First -> Second
  10. }

自定义属性委托

我们还可以通过实现 ReadOnlyPropertyReadWriteProperty 接口来自定义属性委托。

示例:自定义委托

  1. import kotlin.properties.ReadWriteProperty
  2. import kotlin.reflect.KProperty
  3. class NonNegativeVar(initialValue: Int) : ReadWriteProperty<Any?, Int> {
  4. private var value = initialValue
  5. override fun getValue(thisRef: Any?, property: KProperty<*>): Int = value
  6. override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {
  7. if (value >= 0) {
  8. this.value = value
  9. } else {
  10. throw IllegalArgumentException("Negative value is not allowed")
  11. }
  12. }
  13. }
  14. var nonNegativeInt: Int by NonNegativeVar(0)
  15. fun main() {
  16. nonNegativeInt = 5
  17. println(nonNegativeInt) // 输出: 5
  18. try {
  19. nonNegativeInt = -1
  20. } catch (e: IllegalArgumentException) {
  21. println(e.message) // 输出: Negative value is not allowed
  22. }
  23. }

通过这种方式,我们可以在类和属性级别利用委托模式,来增强和复用代码功能。Kotlin 的委托特性提供了强大的灵活性和可复用性,非常适合现代软件开发。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
不似经年 关注 已关注

最近一次登录:2024-11-10 20:28:56   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图