码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Kotlin委托属性(1)


    在Kotlin中,委托属性(Delegated Properties)是一种强大的语言特性,允许你将属性的 getter 和 setter 方法的实现委托给其他对象。这使得你能够通过委托来重用代码、将属性的行为解耦,并实现一些通用的模式。下面是一些关键概念和用法:

    复制代码
    class Example {
        var property: String by Delegate()
    }
    
    class Delegate {
        operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
            // 获取属性值的实际实现
            return "Delegated value"
        }
    
        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
            // 设置属性值的实际实现
            println("Setting value to: $value")
        }
    }
    复制代码

    在上面的代码中,Example类中的property属性的访问,比如,访问example.property,就会委托到Delegate.getValue; 属性值的设置example.property = "str",就会委托到

    Delegae.setValue。

    实际例子:

    复制代码
       fun saveCookie(url: String?, domain: String?, cookies: String) {
            url ?: return
            var spUrl: String by Preference(url, cookies)
            @Suppress("UNUSED_VALUE")
            spUrl = cookies
            domain ?: return
            var spDomain: String by Preference(domain, cookies)
            @Suppress("UNUSED_VALUE")
            spDomain = cookies
        }
    复制代码

         var spUrl: String by Preference(url, cookies),定义一个委托属性spUrl,Preference委托,执行spUrl = cookies,会将这个setValue的动作委托到Preference类中的setValue。

        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
            putSharedPreferences(name, value)
        }

    其中value的值是cookies.如果要访问spUrl,那么,对应的getValue方法,会被委托到Preference中的getValue方法中去。

    总结来说:

    委托属性,就是将一个属性的getValue方法和setValue方法委托到另外一个代理类来实现。将属性的获取和设置隔离开来。

     

    复制代码
    class Preference(val name: String, private val default: T) {
    
        companion object {
            private val file_name = "wan_android_file"
    
            private val prefs: SharedPreferences by lazy {
                App.context.getSharedPreferences(file_name, Context.MODE_PRIVATE)
            }
    
            /**
             * 删除全部数据
             */
            fun clearPreference() {
                prefs.edit().clear().apply()
            }
    
            /**
             * 根据key删除存储数据
             */
            fun clearPreference(key: String) {
                prefs.edit().remove(key).apply()
            }
    
            /**
             * 查询某个key是否已经存在
             *
             * @param key
             * @return
             */
            fun contains(key: String): Boolean {
                return prefs.contains(key)
            }
    
            /**
             * 返回所有的键值对
             *
             * @param context
             * @return
             */
            fun getAll(): Map {
                return prefs.all
            }
        }
    
        operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
            return getSharedPreferences(name, default)
        }
    
        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
            putSharedPreferences(name, value)
        }
    
        @SuppressLint("CommitPrefEdits")
        private fun putSharedPreferences(name: String, value: T) = with(prefs.edit()) {
            when (value) {
                is Long -> putLong(name, value)
                is String -> putString(name, value)
                is Int -> putInt(name, value)
                is Boolean -> putBoolean(name, value)
                is Float -> putFloat(name, value)
                else -> putString(name, serialize(value))
            }.apply()
        }
    
        @Suppress("UNCHECKED_CAST")
        private fun getSharedPreferences(name: String, default: T): T = with(prefs) {
            val res: Any = when (default) {
                is Long -> getLong(name, default)
                is String -> getString(name, default) ?: ""
                is Int -> getInt(name, default)
                is Boolean -> getBoolean(name, default)
                is Float -> getFloat(name, default)
                else -> deSerialization(getString(name, serialize(default)) ?: "")
            }
            return res as T
        }
    
        /**
         * 序列化对象
    
         * @param person
         * *
         * @return
         * *
         * @throws IOException
         */
        @Throws(IOException::class)
        private fun  serialize(obj: A): String {
            val byteArrayOutputStream = ByteArrayOutputStream()
            val objectOutputStream = ObjectOutputStream(
                byteArrayOutputStream
            )
            objectOutputStream.writeObject(obj)
            var serStr = byteArrayOutputStream.toString("ISO-8859-1")
            serStr = java.net.URLEncoder.encode(serStr, "UTF-8")
            objectOutputStream.close()
            byteArrayOutputStream.close()
            return serStr
        }
    
        /**
         * 反序列化对象
    
         * @param str
         * *
         * @return
         * *
         * @throws IOException
         * *
         * @throws ClassNotFoundException
         */
        @Suppress("UNCHECKED_CAST")
        @Throws(IOException::class, ClassNotFoundException::class)
        private fun  deSerialization(str: String): A {
            val redStr = java.net.URLDecoder.decode(str, "UTF-8")
            val byteArrayInputStream = ByteArrayInputStream(
                redStr.toByteArray(charset("ISO-8859-1"))
            )
            val objectInputStream = ObjectInputStream(
                byteArrayInputStream
            )
            val obj = objectInputStream.readObject() as A
            objectInputStream.close()
            byteArrayInputStream.close()
            return obj
        }
    
    }
    复制代码

     

  • 相关阅读:
    6-1 邻接矩阵存储图的深度优先遍历
    【vant】 单元格cell右侧怎么自定义样式
    俄罗斯方块
    开启生成式AI的探索之旅,亚马逊云科技分享生成式AI热门案例
    竣达技术 | 适用于”日月元”品牌UPS微信云监控卡
    【分布式】红包秒杀系统、高并发安全分布式锁
    深入理解TDD(测试驱动开发):提升代码质量的利器!
    从硬件角度看服务器性能调优
    【CSS】背景样式(颜色、图片、平铺、附着和位置)
    node.js安装及环境配置超详细教程【Windows系统安装包方式】
  • 原文地址:https://www.cnblogs.com/ttylinux/p/17948014
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号