IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> kotlin的属性代理 -> 正文阅读

[移动开发]kotlin的属性代理

今天学习了一下kotlin的属性代理,觉的挺有趣的,借助属性代理我们可以实现一些有意思的功能。

基本语法

class Student{
    var name: String by Delegate()
}

class Delegate{
    operator fun <T> getValue(thisRef: Any?, property: KProperty<*>): T{
        ...
    }
    operator fun <T> setValue(thisRef: Any?, property: KProperty<*>, value: T){
        ...
    }
}

案例一:利用属性代理实现json字段的获取

class JsonDelegate(jsonStr: String) {

    val jsonObject: JSONObject = JSONObject(jsonStr)

    public fun <T> delegate(defaultValue: T, key: String = ""): Delegate<T> {
        return Delegate(jsonObject, key, defaultValue)
    }

    public override fun toString(): String {
        return jsonObject.toString()
    }

    class Delegate<T>(
        var jsonObject: JSONObject,
        var key: String,
        val defaultValue: T
    ) {

        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
            val key = getKey(property)
            jsonObject.put(key, value)
        }

        protected fun getKey(property: KProperty<*>): String {
            if (!key.isEmpty()) {
                return key
            }
            return property.name
        }

        operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
            val key = getKey(property)
            if (jsonObject.has(key)) {
                val value = jsonObject.get(getKey(property))
                return value as T
            } else {
                return defaultValue
            }
        }
    }

}

使用方式:

val jsonDelegate = JsonDelegate(jsonStr)
val value1 by jsonDelegate.delegate(-1,"test")//第一个参数是默认值,第二个参数是key
val value2 by jsonDelegate.delegate(-2)//若没有第二个参数,则key为变量名

这样我们在从一段json当中取值时,就不用每次都判断json是否存在这个key,若不存在这个key,则直接返回传入的默认值。

案例二:利用属性代理实现SharedPreferences取值和存储

class SPDelegate(tag: String, context: Context) {
    val sp:SharedPreferences by lazy {
        context.applicationContext.getSharedPreferences(tag,Context.MODE_PRIVATE)
    }

    public fun <T> delegate(defaultValue: T, key: String = ""): Delegate<T> {
        return Delegate(sp,key,defaultValue)
    }

    class Delegate<T>(
        val sp:SharedPreferences,
        var key: String,
        val defaultValue: T
    ) {

        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
            val key = getKey(property)
            with(sp.edit()) {
                when (value) {
                    is String -> putString(key, value)
                    is Int -> putInt(key, value)
                    is Float -> putFloat(key, value)
                    is Long -> putLong(key, value)
                    is Boolean -> putBoolean(key, value)
                    else -> throw IllegalArgumentException("Unsupported type.")
                }
            }.apply()
        }

        protected fun getKey(property: KProperty<*>): String {
            if (!key.isEmpty()) {
                return key
            }
            return property.name
        }

        operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
            val result =  when (defaultValue) {
                is String -> sp.getString(getKey(property), defaultValue as String) ?: defaultValue
                is Int -> sp.getInt(getKey(property), defaultValue as Int)
                is Float -> sp.getFloat(getKey(property), defaultValue as Float)
                is Long -> sp.getLong(getKey(property), defaultValue as Long)
                is Boolean -> sp.getBoolean(getKey(property), defaultValue as Boolean)
                else -> throw IllegalArgumentException("Unsupported type.")
            }
            return result as T
        }
    }
}

使用方式:

val delegate = SPDelegate("MainActivity",this)
var test by delegate.delegate(1,"tttt")//第一个参数表示默认值,第二个参数表示key
var test1 by delegate.delegate("test")//若只有一个参数,则key为变量名称

这样我们就可以避免写出大段的SharedPreferences代码,我们的代码也非常的简洁。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:26:11  更:2022-03-03 16:26:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:07:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码