kotlin学习日记(5)

  • kotlin-代理属性(by)

代理模式
客户端使用一个代理对象实现对真实对象的访问,代理对象和真实对象实现相同的接口,代理对象持有真实对象

Kotlin中,委托的实现依靠于关键字 by ,by表示将实现接口的真实对象(by后边的实例)保存在代理对象的内部,比如SportsManager类继承于ISports接口,并可以ISports接口的所有的 public 方法委托给一个指定的对象。

interface ISports {
  fun doSports()
}
class SwimForSports: ISports{
override fun doSports() {
  println("do swim")
}
}
class SportsManager(sport: ISports): ISports by sport

fun main(args: Array<String>) {
  val swimSports: SwimForSports = SwimForSports()
  SportsManager(swimSports).doSports()// Log:do swim
}
  • by lazy :
    延迟加载属性(lazy property): 属性值只在初次访问时才会计算。var类型属性不能设置为延迟加载属性,因为在lazy中并没有setValue(…)方法
    by lazylateinit 不同的是 在使用lateinit 定义的变量前 一定会给他一个实例 保证他不会是空对象 而 by lazy 则是在第一次使用时 初始化对象
class Bean {
    val str by lazy {
        println("Init lazy")//只有第一次初始化走这步
        "Hello World"
    }
}

在Android开发中 我们会常常用的 by lazy 放一段 BaseActivity 延迟加载 初始化 DataBinding 和 ViewModel 操作

  • 属性委托
    所谓的委托属性,就是对其属性值的操作不再依赖于其自身的getter()/setter()方法,是将其托付给一个代理类,从而每个使用类中的该属性可以通过代理类统一管理,再也不用在每个类中,对其声明重复的操作方法。
val/var <property name>: <Type> by <expression>

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

  • Sealed class类

Sealed class(密封类) 是一个有特定数量子类的类,看上去和枚举有点类似,所不同的是,在枚举中,我们每个类型只有一个对象(实例);而在密封类中,同一个类可以拥有几个对象。

Sealed class(密封类)的所有子类都必须与密封类在同一文件中

Sealed class(密封类)的子类的子类可以定义在任何地方,并不需要和密封类定义在同一个文件中

Sealed class(密封类)没有构造函数,不可以直接实例化,只能实例化内部的子类

sealed class SealedClass{
    class SealedClass1():SealedClass()
    class SealedClass2():SealedClass()
    fun hello(){
        println("Hello World ... ")
    }
}
fun main(args:Array<String>){
    var sc:SealedClass = SealedClass()//这里直接编译报错
}
fun main(args:Array<String>){
    var sc:SealedClass = SealedClass.SealedClass1()//只能通过密封类内部的子类实例化对象,这时就可以执行里面的方法了
    sc.hello()
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是在学习和使用kotlin时的一些总结与体会,一些代码示例来自于网络或Kotlin官方文档,持续更新... 对...
    竹尘居士阅读 3,359评论 0 8
  • Kotlin笔记 要理解Java与Kotlin的区别,就要从最根本的上来理解。Java是解释型语言(边解释成二进制...
    FFFSnow阅读 1,043评论 0 0
  • 声明,这里是我平时日常的笔记Zone,所以记录可能会偏向于我认为的重点区域,会有些疏漏或者缺失的地方,或是排版或者...
    哥哥是欧巴Vitory阅读 891评论 0 2
  • Kotlin 时间线 2011年7月,JetBrains 推出 Kotlin 项目 2012年2月,JetBrai...
    灰灰鸽阅读 459评论 0 2
  • 1.前言 我们都知道,Java是一种面向对象编程语言,在 Java 中,万物皆对象。其实,kotlin 也是一门面...
    西小瓜阅读 990评论 0 0