Kotlin的属性代理

简介: 一、定义一个方法 val/var : by (代理者)表达式 代理者需要实现相应的setValue/getValue 方法 如果是val,只需要设置getValue方法 如果是var,则需要设置setValue/getValue 方法二、看一个属性代理的例子吧package net.

一、定义一个方法
val/var <变量name>: <类型 Type> by (代理者)表达式
代理者需要实现相应的setValue/getValue 方法
如果是val,只需要设置getValue方法
如果是var,则需要设置setValue/getValue 方法

二、看一个属性代理的例子吧

package net.println.kotlin.chapter4.delegates

import kotlin.reflect.KProperty

/**
 * @author:wangdong
 * @description:
 */

class Delegates{

    //只有第一次访问到的时候,才会去初始化它
    // 通过by的方式来声明变量的时候,例如Hello的getValue就会交给lazy这个代理来完成
    val hello by lazy {
        "HelloBoy"
    }

    val hello2 by X()

    var hello3 by X()
}

/**写一个代理类*/
class X{
    private var value: String? = null

    //可读的方法
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        println("getValue: $thisRef -> ${property.name}")
        return value?: ""
    }

    //可写的方法
    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String){
        println("setValue, $thisRef -> ${property.name} = $value")
        this.value = value
    }
}

fun main(args: Array<String>) {
    val delegates = Delegates()
    println(delegates.hello)
    println(delegates.hello2)
    println(delegates.hello3)
    delegates.hello3 = "hello wdddd"
    println(delegates.hello3)
}

哈,结束啦

目录
相关文章
|
7月前
|
IDE Java 编译器
Kotlin属性访问器与方法签名冲突的问题
Kotlin属性访问器与方法签名冲突的问题
51 0
|
4月前
|
Kotlin
kotlin获取属性注解
kotlin获取属性注解
45 0
|
6月前
|
Cloud Native Go Kotlin
Kotlin 环境下解决属性初始化问题
Kotlin 环境下解决属性初始化问题
25 0
|
8月前
|
Java Kotlin
Kotlin中与Java互操作与可空性、类型映射、属性访问、@JvmOverloads、@JvmField、@JvmStatic、@Throws和函数类型操作详解
Kotlin中与Java互操作与可空性、类型映射、属性访问、@JvmOverloads、@JvmField、@JvmStatic、@Throws和函数类型操作详解
68 0
|
JSON 安全 Java
Kotlin学历之委托属性
Kotlin学历之委托属性
98 0
Kotlin学历之委托属性
|
Java Kotlin
【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)(二)
【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)(二)
189 0
|
Java 编译器 开发者
【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)(一)
【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)(一)
317 0
【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)(一)
|
存储 Kotlin
【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )
【Kotlin】扩展属性 ( 扩展变量属性 | 扩展常量属性 | 注意事项 | 本质分析 )
129 0
|
存储 Kotlin
【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
191 0
【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
|
Kotlin
【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )(二)
【Kotlin】接口 ( 声明 | 实现 | 接口方法 | 接口属性 | 接口覆盖冲突 | 接口继承 )(二)
238 0