Kotlin by关键字作用及使用介绍

目录
  • 1.Kotlin委托
  • 2.类委托
  • 3.属性委托
    • 3.1定义一个被委托的类
    • 3.2标准委托
    • 3.3把属性存储在映射中
    • 3.4Not Null

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关键字内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android关键字persistent详细分析

    目录 Android关键字persistent原理分析​ persistent属性作用 使用 二.原理分析 1.persistent属性的解析 2.系统启动时启动persistent为true的app 3.app被异常结束后系统重新启动persistent为true的app 总结 Android关键字persistent原理分析​ 在Android程序开发时我们会接触到一些系统为了某些功能而定义的关键属性,例如在AndroidManifest.xml文件中 经常看到的persistent.pro

  • Android 常用log 关键字

    记录下常用的log关键字 1.windowmanager接收到全局按键 WindowManager: interceptKeyTq keycode=26 interactive=false keyguardActive=true policyFlags=2000000 WindowManager: interceptKeyTq keycode=26 interactive=false keyguardActive=true policyFlags=2000000 down =true // 按下

  • Kotlin by关键字作用及使用介绍

    目录 1.Kotlin委托 2.类委托 3.属性委托 3.1定义一个被委托的类 3.2标准委托 3.3把属性存储在映射中 3.4Not Null 1.Kotlin委托 在委托模式中,两个对象参与处理同一请求,接受请求的对象讲请求委托给另外一个对象来处理.Kotlin直接支持委托模式,更加优雅,简洁.kotlin通过关键字by实现委托. 2.类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的. 以下实例中派生类Derived继承了接口Base所有方法,并且委托一个传入的Ba

  • Kotlin作用域函数使用示例详细介绍

    目录 1 let 2 run 3 with 4 apply 5 also 这里我们将介绍Kotlin 5个作用域函数:let,run,with,apply,also. 1 let let 可用于范围界定和空值检查.在对象上调用时,let 执行给定的代码块并返回其最后一个表达式的结果.对象可通过引用它(默认情况下)或自定义名称在块内进行访问. 所以,总结起来,let 有如下三大特征: // 重点11:使用it替代object对象去访问其公有的属性 & 方法 object.let{ it.todo(

  • Java基础之final关键字作用案例

    final关键字的作用 final关键字可以用来修饰引用.方法和类. 1.final关键字修饰类 当用final关键字修饰一个类后,这个类不能被继承.代码示例如下:  所以当定义一个类时,需要想好该类将来是否会被继承. 2.final关键字修饰方法 当用final关键字修饰一个方法后,这个方法不能被重写.代码示例如下:  注意:一个类的private方法会隐式的被指定为final方法. 3.final关键字修饰变量 final关键字修饰的变量初始化后不能再被修改.代码示例如下: 如果是引用类型的

  • java中instanceof 关键字作用和实际用途详解

    instanceof 1. instanceof 是Java中的一个关键字,Java中的关键子都是小写. 2. instanceof关键字的作用是判断左边对象是否是右边类(这里有很多人说是对象,所以注意这里是类,并不是对象)的实例(通俗易懂的说就是:子类对象,或者右边类本身的对象)返回的boolean类型,true和false. 举个例子: public class Dome{ class Perse extends Object{} class Student extends Perse{}

  • Kotlin挂起函数的详细介绍

    Kotlin 协程的优势: 解决回调地狱的问题. 以同步的方式完成异步任务. 示例: fun main() { runBlocking { val a = getA() println(a) val b = getB(a) println(b) val c = getC(b) println(c) } } suspend fun getA(): String { withContext(Dispatchers.IO) { delay(2000L) } return "A content"

  • Kotlin类的继承实现详细介绍

    1.在kotlin中,默认类都是封闭的closed的.如果要让某个类开放继承,必须用open关键字修饰 类中的方法默认也是关闭的.如果需要子类复写父类的方法,也必须用open修饰. 1)定义父类,用open将类继承打开.用open将函数的复写打开. //父类必须用open修饰,才能够被继承 open class Person(val name:String) { var age = 0 //父类定义的函数,必须有open修饰,子类才能复写 open fun doWork(){ println("

  • Java 关键字 速查表介绍

    访问控制: private 私有的 protected 受保护的 public 公共的 类.方法和变量修饰符 abstract 声明抽象 class 类 extends 扩允,继承 final 终极,不可改变的 implements实现 interface 接口 native 本地 new 新,创建 static 静态 strictfp 严格,精准 synchronized 线程,同步 transient 短暂 volatile 易失 程序控制语句 break 跳出循环 continue 继续

  • Maven是什么?Maven的概念+作用+仓库的介绍+常用命令的详解

    Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型.一组标准集合,一个依赖管理系统.和用来运行定义在生命周期阶段中插件目标和逻辑. 核心功能 Maven的核心功能是合理叙述项目间的依赖关系,通俗点 就是通过pom.xml文件的配置获取jar包不用手动的去添加jar包,,这个pom.xml包我后面会叙述,不过已经学习过maven的 人应该对这个很熟悉.其本质就是通过配置pom.xml来获取jar包,当然这是在该项目必须是maven项目的前提下.那么什么是m

  • java中this关键字的详细使用介绍

    this 的使用:修饰属性和方法,也可以理解为当前对象 this 调用构造器: 1.我们在类的构造器里,可以使用,调用本类中指定的其他构造器 2.构造器中不能通过”this(形参列表)“的方法来调用自己 3.如果有一个类中有n个构造器,则最多有n-1个构造器中使用”this(形参列表)“的方法 4.规定:”this(形参列表)“必须声明在当前构造器的首行 5.构造器内部,最多可以声明一个”this(形参列表)“的方法,用来调用其他的构造器 补充:eclipse中快速创建this source--

  • Kotlin协程的启动方式介绍

    目录 1.GlobalScope.launch 2.runBlocking 启动协程 3.async启动协程 启动协程的基本方式 1.GlobalScope.launch 代码示例: fun testGlobalScope() { GlobalScope.launch { println("Coroutinue started!") delay(1000L) println("Hello World!") } println("After launch!&

随机推荐