kotlin委托工厂map存储属性值(代码片段)

nicolas2019 nicolas2019     2022-12-19     293

关键词:

1.委托工厂

(1)概念

? 委托工厂顾名思义:生产委托对象的工厂类。

(2)定义

? 该类实现了operator修饰的provideDelegate方法,返回ReadWriteProperty/ReadOnlyProperty,该类就可提供对应类型的委托对象。

/**
 * 委托工厂类(生产委托对象)
 */
class ProvideDelegate 
    /**
     * 定义该方法该类就是委托工厂类
     * 返回值:ReadWriteProperty<CommonClass,String>或者ReadOnlyProperty<CommonClass,String>都可以,一个是返回读写属性的委托类,一个是返回只读属性的委托类
     */
    operator fun provideDelegate(thisRef: Any?, property: KProperty<*>) : ReadWriteProperty<CommonClass,String> 
        println("provideDelegate")
        return MyDelegateClass()
    


/**
 * 定义一个委托类,实现了ReadWriteProperty(读写属性委托类)接口,只读属性委托类实现ReadOnlyProperty接口即可
 */
class MyDelegateClass : ReadWriteProperty<CommonClass,String>
    var _property : String = "委托类属性初始值"
    override fun getValue(thisRef: CommonClass, property: KProperty<*>): String 
        println("getValue")
        return _property
    

    override fun setValue(thisRef: CommonClass, property: KProperty<*>, value: String) 
        println("setValue")
        _property = value
    



/**
 * 定义一个普通类
 */
class CommonClass 
    /**
     * 属性委托于委托工厂
     */
    var property : String by ProvideDelegate()


fun main(args: Array<String>) 
    val commonClass = CommonClass()
    println(commonClass.property)
    commonClass.property = "修改值"
    println(commonClass.property)

运行结果:

provideDelegate
getValue
委托类属性初始值
setValue
getValue
修改值

2.委托属性应用-使用Map存储属性值

(1)原理

  • Map实现了符合属性委托规则的getValue方法,因此只读属性可委托于map对象。
  • MutableMap实现了符合属性委托规则的setValue和getValue方法,因此读写属性可委托于mutableMap对象。
这么做的好处是对象本身不负责存储属性值,交给Map对象管理,程序也不需要将对象直接暴露出来,只需要通过map管理对象属性即可。

(2)示例

只读属性示例:

/**
 * 定义一个类,构造器传入map对象
 */
class MapDelegateClass(map: Map<String, String>) 
    val property1 : String by map//只读属性委托于map对象
    val property2 : String by map//只读属性委托于map对象


fun main(args: Array<String>) 
    val map = mapOf(
            "property1" to "p1",
            "property2" to "p2"
    )
    val mapDelegateClass = MapDelegateClass(map)
    println(mapDelegateClass.property1)//①
    println(mapDelegateClass.property2)//②
    println(map["property1"])//通过map索引属性值名来获取属性,等同于①
    println(map["property2"])//通过map索引属性值名来获取属性,等同于②

运行结果:

p1
p2
p1
p2

读写属性示例:

/**
 * 定义一个类,构造器传入MutableMap对象
 */
class MutableMapDelegate(mutableMap: MutableMap<String, String>) 
    var property1: String by mutableMap//属性1委托于mutableMap对象
    var property2: String by mutableMap//属性2委托于mutableMap对象


fun main(args: Array<String>) 
    val mutableMap = mutableMapOf<String, String>()
    mutableMap["property1"] = "p1"//①
    mutableMap["property2"] = "p2"//②
    val mutableMapDelegate = MutableMapDelegate(mutableMap)
    println(mutableMapDelegate.property1)
    println(mutableMapDelegate.property2)
    mutableMapDelegate.property1 = "p1change"//等同于①
    mutableMapDelegate.property2 = "p2change"//等同于②
    println(mutableMapDelegate.property1)
    println(mutableMapDelegate.property2)

运行结果:

p1
p2
p1change
p2change

kotlin-by详解(代码片段)

Kotlin中by关键字用来简化实现代理(委托)模式,不仅可以类代理,还可以代理类属性,监听属性变化,下面我们来介绍by的几种主要使用场景:类的代理class属性延迟加载lazy可观察属性Delegates.observable(扩展Delegates.vetoable)自... 查看详情

kotlin对象枚举委托(代码片段)

目录一、Kotlin对象1.kotlin伴生对象2.kotlin对象和单例模式二、Kotlin枚举1.kotlin定义枚举2.kotlin使用枚举三、Kotlin委托1.kotlin类委托2.kotlin属性委托3.kotlinMap委托4.kotlin延迟属性5.kotlin属性监听附Github源码一、Kotlin对象1.kotlin伴生对象clas... 查看详情

firebase db:具有 Kotlin 委托属性的模型

】firebasedb:具有Kotlin委托属性的模型【英文标题】:firebasedb:modelswithKotlindelegatedproperties【发布时间】:2017-08-0122:14:13【问题描述】:我正在使用Kotlin对象来处理我的Firebase数据库模型,如intheguide所述。我有很多存储为字符串的... 查看详情

kotlin委托的本质以及mmkv的应用(代码片段)

作者:DylanCai前言很多人写Kotlin只用到一些Java已有的东西,单纯地把Java代码翻译成Kotlin代码,而Kotlin一些好用的语法糖都没有用过。本文给大家介绍一个Java不常见但是很好用的Kotlin语法糖——Kotlin委托。Kotlin委托包... 查看详情

kotlin小知识之泛型和委托(代码片段)

...属性实现一个自己的lazy函数泛型和委托泛型的基本用法Kotlin当中的泛型机制和Java当中的泛型机制还是有异同的所谓泛型就是说在一般的编程模式下面,我们需要给一个变量指定一个具体的类型,而泛型允许我们在不指定具体类型... 查看详情

kotlin中委托的概念和原理(代码片段)

kotlin中委托的概念和原理问题背景kotlin的日常使用过程中,经常会使用到委托机制,问题来了,委托机制究竟是什么呢?委托模式:多个对象接收并处理同一请求,他们将请求委托给另一个对象统一处理请求。比如调用A类的metho... 查看详情

kotlin委托属性(代码片段)

funmain(arg:Array<String>)valmyClass1=myClass1()myClass1.name="mycalsss1"valmyClass2=myClass2()myClass2.name="myclass2"println(myClass1.name)println(myClass2.name)classmyClass1varname:String=""get():Stringprintln("mycalsss1.get被调用")returnfieldset(value:String)println("myclass1.set被调... 查看详情

优雅地封装mmkv,属性委托原来是这么回事(代码片段)

...不过DataStore的API比SharedPreferences复杂得多,还用到了Kotlin协程的Flow,学习成本比较高。所以个人推荐用腾讯开源的MMKV。MMKV的用法其实已经挺简单了,不过结合Kotlin属性委托会更加好用。应该有很多人对Kotlin的属性委... 查看详情

kotlin委托必须重视的几个点(代码片段)

委托模式是实现继承的一个很好的替代方式,也是Kotlin语言的一种特性,可以很优雅的实现委托模式。在开发过程中也少不了使用它,但常常都会被低估。所以今天就让它得到重视,去充分的掌握kotlin委托特性以... 查看详情

如何为 kotlin 委托属性使用不同的类型

】如何为kotlin委托属性使用不同的类型【英文标题】:Howtousedifferenttypesforkotlindelegationproperties【发布时间】:2021-10-1812:18:19【问题描述】:我尝试编写一个LiveData类,它将原始(可为空的)值包装到一个Result类中,清楚地表明是... 查看详情

对比java学kotlin代理(代码片段)

...c;而且使用Java无法完成对属性的委托。而我们今天的主角Kotlin则对上述问题做了改进。Kotlin代理在Kotlin中,我们使用关键字by使用委托功能。代理方法Kotlin对方法的委托是借助接口来实现的。具体用法如下:interfaceBasefunpr... 查看详情

scsssass:使用map#sass键入值工厂和验证器(代码片段)

查看详情

深入kotlin-委托(代码片段)

委托委托不是java中的概念。它仅仅是一种设计模式,但是kotlin从语言层级上,通过by关键字提供了对委托模式的支持。类委托interfaceMyInteface//1 funmyPrint()classMyInterfaceImpl(valname:String):MyInterface//2 overridefunmyPring() println(name) 查看详情

kotlin集合操作⑤(map集合|获取map值|map遍历|可变map集合)(代码片段)

文章目录一、Map集合二、获取Map值三、Map遍历四、可变Map集合一、Map集合调用mapOf函数创建Map集合,键值对元素有两种初始化方式:使用to函数进行初始化:在参数中使用键to值的方式进行初始化;使用Pair对象进行初始化:传入Pair(键,值... 查看详情

kotlin委托(代码片段)

1、类委托类的委托是一个类中定义的方法实际是调用另一个类的对象的方法来实现的。interfaceIDemofunaction1()funaction2()//被委托的类classDemoImpl:IDemooverridefunaction1()println("doaction1")overridefunaction2()println("doaction2")/ 查看详情

kotlin委托(代码片段)

1、类委托类的委托是一个类中定义的方法实际是调用另一个类的对象的方法来实现的。interfaceIDemofunaction1()funaction2()//被委托的类classDemoImpl:IDemooverridefunaction1()println("doaction1")overridefunaction2()println("doaction2")/ 查看详情

kotlin委托(代码片段)

1、类委托类的委托是一个类中定义的方法实际是调用另一个类的对象的方法来实现的。interfaceIDemofunaction1()funaction2()//被委托的类classDemoImpl:IDemooverridefunaction1()println("doaction1")overridefunaction2()println("doaction2")/ 查看详情

kotlin合同对另一个属性/功能有影响(代码片段)

是否有可能与Kotlin合同使这个智能广播成为可能?假设我有地图的跟随扩展功能fun<K,V>Maps<K,V>.contains(k:K):Boolean//simplycheckformapcontainingkey在调用该方法之后,我希望将此调用转换为NotNull:if(map.contains(key))map.get(key).callAnyMeth... 查看详情