当前位置: 首页 > news >正文

Android(Kotlin) 委托(by) 封装 SharedPreferences

在 Kotlin 中,委托是一种通过将自身的某个功能交给另一个对象来实现代码重用的技术。通过委托,我们可以将某个属性或方法的实现委托给另一个对象,从而减少重复代码的编写。委托可以用于实现多重继承、代码复用和扩展现有类的功能。 Kotlin 中的委托通过关键字 “by” 来实现。委托分为两种:类委托和属性委托。

类委托是将接口的实现委托给另一个类,属性委托是将属性的实现委托给另一个对象。

本文讲解的是使用自定义属性委托来封装 SharedPreferences 的使用


var field by EntrustClass()

这就是比较常见的属性委托了,调用字段 field get()/set() 会对应到委托类 EntrustClass 的 getValue()/setValue()。举个例子:

class EntrustClass(private var name: String) {operator fun getValue(thisRef: Any?, property: KProperty<*>): String {println("调用了getValue() === $name")return name}operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {println("调用了setValue() === $value")name = value}
}fun main() {var field by EntrustClass("张三")field            // 调用了 get()field = "李四"    // 调用了 set()
}Run main:
调用了getValue() === 张三
调用了setValue() === 李四

在第一行属性 field 委托给了类 EntrustClass,字段类型是与委托类 getValue() 的返回值类型相同的

当 field 进行 get()/set() 操作时,就会执行委托类的 getValue()/setValue() 逻辑


这样子就可以把一些冗余的代码操作(比如 SharedPreferences)使用(by)进行封装:

String 类型:

class SpString(private val spName: String, val key: String, private val defValue: String = "") {operator fun getValue(thisRef: Any?, property: KProperty<*>): String {val sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE)return sp.getString(key, defValue)!!}operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {val sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE)sp.edit().putString(key, value).apply()}
}

Boolean 类型:

class SpBoolean(private val spName: String, val key: String, private val defValue: Boolean = false) {operator fun getValue(thisRef: Any?, property: KProperty<*>): Boolean {val sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE)return sp.getBoolean(key, defValue)}operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) {val sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE)sp.edit().putBoolean(key, value).apply()}
}

其余的类型可以自行拓展


用法:

    private var spBooleanValue by SpBoolean(SP_NAME, "key1")private var spStringValue by SpString(SP_NAME, "key2")private fun getBooleanValue(): Boolean = spBooleanValueprivate fun getStringValue(): String = spStringValueprivate fun setSpValue(value: Boolean) {spBooleanValue = value}private fun setSpValue(value: String) {spStringValue = value}

直接在对象上 get 和 set 即可进行对 SharedPreferences 的读取和写入


在实际的开发当中,会在一个工具类当中进行 SharedPreferences 数据的读写,已经非常好了。但是若数据存储量非常大时,会使得工具类非常臃肿,使用委托封装可以进一步减少冗余代码

http://www.lryc.cn/news/339493.html

相关文章:

  • 2022年蓝桥杯省赛软件类C/C++B组----积木画
  • Python数据挖掘项目开发实战:使用朴素贝叶斯进行社会媒体挖掘
  • 【DM8】ET SQL性能分析工具
  • 001-谷粒商城-微服务剖析
  • vue实现前端打印效果
  • android wifi直连 wifip2pmanager
  • 伸缩应用程序和执行滚动更新
  • 解决WPS右键菜单冗余选项,去除WPS右键菜单选项
  • 部署ELFK+zookeeper+kafka架构
  • ActiveMQ 任意文件上传漏洞复现
  • k8s实践总结
  • 前端从零到一搭建脚手架并发布到npm
  • 使用 git 提交项目到 github
  • SRE 与传统 IT 运营有何不同?
  • html公众号页面实现点击按钮跳转到导航
  • 【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法
  • OSPF动态路由实验(华为)
  • EasyRecovery2024专业免费的电脑数据恢复软件
  • Vue集成PageOffice实现在线编辑word、excel(前端配置)
  • IBM SPSS Statistics for Mac:数据分析的卓越工具
  • python爬虫------- Selenium下篇(二十三天)
  • 获取字符串的全排列(去除字符串中2个字符相同时造成的重复)
  • HTML5新增的多媒体标签
  • 温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用
  • ActiveMQ 04 Linux下安装
  • .pyc 文件是什么?是否有必要同步到 GitHub 远程仓库?
  • Zookeeper的集群搭建和ZAB协议详解
  • STM32 MPU配置参数
  • Kafka概述
  • OpenHarmony编译构建系统