码农知识堂 - 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
        }
    
    }
    复制代码

     

  • 相关阅读:
    Matlab 紧凑子图 缩小子图间距及边缘 自带函数
    Python数据类型底层、推导、生成器、迭代器、装饰器
    聊聊Spring Cloud Gateway 动态路由及通过Apollo的实现
    【数据结构与算法】之深入解析“两个盒子中球的颜色数相同的概率”的求解思路与算法示例
    记一次dubbo整合nacos no Provider排查
    node_modules/.bin/vue-cli-service: Permission denied
    JS 之 常用内置类的使用
    Javaweb之javascript的详细解析
    DocCMS keyword SQL注入
    Drozer安装
  • 原文地址:https://www.cnblogs.com/ttylinux/p/17948014
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号