文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Kotlinby关键字作用及使用介绍

2024-04-02 19:55

关注

1.Kotlin委托

在委托模式中,两个对象参与处理同一请求,接受请求的对象讲请求委托给另外一个对象来处理。Kotlin直接支持委托模式,更加优雅,简洁。kotlin通过关键字by实现委托。

2.类委托

类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。

以下实例中派生类Derived继承了接口Base所有方法,并且委托一个传入的Base类的对象来执行这些方法。

//创建接口
interface Base {
    fun print()
}
//实现此接口的被委托的类
class BaseImp(val x:Int) : Base {
    override fun print() {
 
        println(x)
    }
}
//通过关键字by建立委托类
class Derived (b:Base):Base by b
class Main {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            var baseImp=BaseImp(100)
            Derived(baseImp).print()  //输出100
        }
    }
}

在Derived声明中,by子句表示,将b保存在Derived的对象实例内部,而且编译器将会生成继承自Base接口的所有方法,并将调用转发给b。我们看看生成的java代码。

public final class Derived implements Base {
   // $FF: synthetic field
   private final Base $$delegate_0;
   public Derived(@NotNull Base b) {
      Intrinsics.checkNotNullParameter(b, "b");
      super();
      this.$$delegate_0 = b;
   }
   public void print() {
      this.$$delegate_0.print();
   }
}

3.属性委托

属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其委托给一个代理类,从而实现对该类的属性统一管理。

属性委托语法格式:

val/var <属性名>:<类型> by <表达式>

by关键字之后的表达式就是委托,属性的get()方法(以及set()方法)将被委托给这个对象的getValue()和setValue()方法。属性委托不必实现任何接口,但是必须提供getValue()函数(对于var属性,还需要setValue()函数)。

3.1定义一个被委托的类

该类包含getValue()方法和setValue()方法,且参数thisRef为进行委托的类的对象,prop为进行委托的属性的对象。

//定义包含属性委托的类
class Example {
    var p:String by Delegate()
}
//委托的类
open class Delegate {
    operator fun getValue(thisRef:Any?,property:KProperty<*>):String{
        return "$thisRef,这里委托了${property.name} 属性"
    }
    operator fun setValue(thisRef: Any?,property: KProperty<*>,value:String){
        println("$thisRef 的 ${property.name} 属性赋值为 $value")
    }
}
class Main {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            var e=Example()
            println(e.p) //访问该属性 调用getValue函数
            e.p="rururn" //调用setValue()函数
            println(e.p)
        }
    }
}

输出结构为:

com.geespace.lib.kotlin.by2.Example@3f99bd52,这里委托了p 属性
com.geespace.lib.kotlin.by2.Example@3f99bd52 的 p 属性赋值为 rururn
com.geespace.lib.kotlin.by2.Example@3f99bd52,这里委托了p 属性

3.2标准委托

Kotlin的标准库已经内置了很多工厂方法来实现属性的委托。

延迟属性Lazy

lazy()是一个函数,接受一个Lambda表达式作为参数,返回一个Lazy<T>实例的函数,返回的实例可以作为延迟属性的委托:第一次调用get()会执行已传递给lazy()的lamda表达式并记录结果,后续调用get()只是返回记录的结果。

class LazyTest {
    companion object{
        val lazyValue:String by lazy {
            println("computed!") //第一次调用输出,第二次调用不执行
            "Hello"
        }
        @JvmStatic
        fun main(args: Array<String>) {
            println(lazyValue)
            println(lazyValue)
        }
    }
}

执行输出结果:

computed!
Hello
Hello

3.3把属性存储在映射中

一个常见的用例是在一个映射(map)里存储属性的值。这经常出现在像解析JSON或者其他"动态"事情的应用中。这种情况下,你可以使用映射实例自身作为委托来实现委托属性。

class Site(val map:Map<String,Any?>) {
    val name:String by map
    val url:String by map
}
class TestMain {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            val site=Site(mapOf(
                "name" to "maozh",
                "url"  to "www.baidu.com"
            ))
            //读取映射值
            println(site.name)
            println(site.url)
        }
    }
}

执行输出结果:

maozh
www.baidu.com

3.4Not Null

notNull适用于那些无法在初始化阶段就确定属性值的场合。

class Foo{
     var notNullBar:String by Delegates.notNull<String>()
}
foo.notNullBar="bar"
println(foo.notNullBar)

需要注意,如果属性在赋值前就被访问的话则会抛出异常。

到此这篇关于Kotlin by关键字作用及使用介绍的文章就介绍到这了,更多相关Kotlin by关键字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯