文章目录

  • 基本语法
  • 案例一:利用属性代理实现json字段的获取
  • 案例二:利用属性代理实现SharedPreferences取值和存储

今天学习了一下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) ?: defaultValueis 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代码,我们的代码也非常的简洁。

kotlin的属性代理相关推荐

  1. [译]带你揭开Kotlin中属性代理和懒加载语法糖衣

    翻译说明: 原标题: How Kotlin's delegated properties and lazy-initialization work 原文地址: https://medium.com/t ...

  2. Kotlin - 属性代理

    自定义属性代理 代理也叫委托,Kotlin 支持属性代理,把一个属性的获取与赋值交给一个"中介"(下称 Delegate)去管理,属性代理的语法是: val/var <属性名 ...

  3. kotlin获取属性_Kotlin程序获取系统MAC地址

    kotlin获取属性 The task is to get system MAC address. 任务是获取系统MAC地址. package com.includehelp import java. ...

  4. kotlin 覆盖属性_Kotlin程序| 方法覆盖的示例

    kotlin 覆盖属性 方法重载 (Method Overriding) Method overriding allows derived class has the same function na ...

  5. [react] 举例说明什么是高阶组件(HOC)的属性代理

    [react] 举例说明什么是高阶组件(HOC)的属性代理 function HOC(WrappedComponent) {return class HOC extends Component {re ...

  6. kotlin获取属性_Kotlin程序获取系统名称

    kotlin获取属性 The task is to get the system name. 任务是获取系统名称. package com.includehelp import java.net.In ...

  7. kotlin获取属性_Kotlin程序| 属性获取器和设置器方法的示例

    kotlin获取属性 属性获取器和设置器方法 (Properties Getter and Setter Methods) Variable having a class-level scope, d ...

  8. Kotlin by属性委托

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119939781 本文出自[赵彦军的博客] 文章目录 属性委托要求 委托原理 实战演 ...

  9. 【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )

    文章目录 I . 属性 字段 总结 II . 属性声明 III . 属性初始化器 IV . get / set 属性访问器 V . 属性幕后字段 field VI . 变量和常量的区别 VII . 延 ...

  10. Android kotlin静态属性、静态方法

    Kotlin类不支持静态方法和成员,但Kotlin支持全局函数和变量,因此我们可以直接使用全局函数和变量来代替类中静态方法和静态成员变量.不过还有一个问题没解决,如果要使用类中的这些全局函数和变量,该 ...

最新文章

  1. bytebuf池_Netty默认的Bytebuf是堆内还是堆外?池化or非池化?
  2. java判断44数组是否是4阶幻方_2015蓝桥杯决赛Java A组 第二题--四阶幻方
  3. 【深度学习mmdetection错误】——mmdetection 运行报错KeyError:‘ConvWS is already registered in conv layer‘
  4. pbdom 不能解析gbk_备受家长追捧的公立学校,摇中率不到3%,还要抢着报名?速看大摇号学校全面解析!...
  5. 微软十二月补丁星期二修复58个漏洞
  6. python(12)给文件读写上锁
  7. 火到爆的扩散模型(Diffusion Model)帮你具象化幻想世界
  8. KMeans原理和密度聚类
  9. 圣思园Java视频 学习笔记
  10. 网站接入QQ登录功能的实现
  11. css3实现动画的三种方式
  12. Android仿高德地图打车的三段式BottomSheet
  13. PL/SQL——员工涨工资问题
  14. Ubuntu 20.04 安装企业微信
  15. 用C++写一个简单小病毒(零基础奶妈级教学,不可能学完还不懂)
  16. centos7查看oracle监听端口,CentOS 7开放及查看防火墙firewall的端口
  17. ssm报错:No qualifying bean of type ‘com.hr.service.LoginService‘ available
  18. QEMU 上模拟 KZM 开发板
  19. Redis6笔记分享(从NoSQL基础到分布式锁的介绍)
  20. Western Blot

热门文章

  1. java入门第二天如何使用Elipse
  2. 应用java编写 按键小脚本_一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码) | 学步园...
  3. 视觉感知「挑战」天花板,多摄像头环绕方案同比增长近100%
  4. DarkAngels勒索病毒分析
  5. Linux常用命令大全(非常全面)
  6. Linux常用命令,Linux常用基本命令大全
  7. 养老院管理系统如何开发详解
  8. 计算机组成原理课后答案(唐朔飞第三版) 第三章
  9. 编写一个java小程序输出学生姓名在Unicode表中的位置
  10. Html5判断手机型号,WebView-修改userAgent用于网页端判断手机型号