目录

1.Kotlin委托

2.类委托

3.属性委托

3.1定义一个被委托的类

3.2标准委托

3.3 把属性存储在映射中

3.4 Not 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 bclass Main {companion object{@JvmStaticfun 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 fieldprivate 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{@JvmStaticfun 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"}@JvmStaticfun 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 mapval url:String by map
}class TestMain {companion object{@JvmStaticfun 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.4 Not Null

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

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

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

Kotlin by 关键字相关推荐

  1. kotlin 中关键字 lateinit

    顾名思义,这是指一个延迟初始化的变量.在kotlin里面,如果在类型声明之后没有使用符号?,则表示该变量不会为null.但是这个时候会要求我们初始化一个值.有些时候,我们在声明变量的时候,并不能初始化 ...

  2. Kotlin 基础学习 (一) 关键字

    Kotlin 线上编写练习 Kotlin官网提供了 PlayGround 供大家线上尝试 地址:https://play.kotlinlang.org/ 原文:https://www.jianshu. ...

  3. Kotlin极简教程:第10章 Kotlin与Java互操作

    Kotlin is 100% interoperable with Java™ and Android™ 在前面的章节中,我们已经学习了Kotlin的基础语法.类型系统.泛型与集合类.面向对象与函数式 ...

  4. BeginnersBook Kotlin 教程

    来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request. 请您勇敢地去翻译和改 ...

  5. Kotlin基础语法学习类和对象(一)

    类定义 Kotlin 类可以包含:构造函数和初始化代码块.函数.属性.内部类.对象声明. Kotlin 中使用关键字 class 声明类,后面紧跟类名: class Runoob { // 类名为 R ...

  6. Kotlin入门(19)Android的基础布局

    线性布局 线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右水平排列.排列顺序只能指定一维 ...

  7. Kotlin学习笔记五、控制语句

    一.条件分支 a.简单分支 最简单的条件分支莫过于if-else- var mod = System.currentTimeMillis() % 3 if (mod == 0L){println(&q ...

  8. Kotlin骚气写法 三

    文章目录 ViewGroup获取ChildView集合 inline noinline crossinline比较 Kotlin 简化 Parcelable orEmpty() kotlin 代理 关 ...

  9. 【Kotlin】Kotlin 教程

    kotlin 教程 前言 什么是kotlin 什么是Java? kotlin 与 Java有什么区别 kotlin 的特点 Java的特点 kotlin 的历史 JAVA的历史 kotlin 的优势 ...

最新文章

  1. 玩转Windows 7
  2. php+实现群发微信模板消息_php实现发送微信模板消息的方法,php信模板消息_PHP教程...
  3. Struts2+Android (3) 多种方式向服务器发送信息
  4. 【数据分析】八种缺失值处理方法总有一种适合你
  5. Java获取文件大小,文件夹内文件个数的工具类
  6. MySQL 索引 :哈希索引、B+树索引、全文索引
  7. micropython固件源码_Micropython加速物联网开发7 - Micropython源码编译与固件更新
  8. .h 与 .hpp 文件
  9. 【华为云技术分享】8种ETL算法汇总大全!看完你就全明白了
  10. arm nodejs_英伟达打算收购Arm,或将成有史以来最大半导体收购案
  11. Rust : channel、多线程与 CTP相关机制的模拟
  12. Lae程序员小漫画(1),仅供一乐
  13. 系统更新后出现dll文件丢失问题
  14. 在spring security手动 自定义 用户认证 SecurityContextHolder
  15. 线代9讲_特征值与特征向量相似理论
  16. 【状语从句练习题】综合训练
  17. Jackson注解:@JsonAlias使用详解
  18. 什么是云原生的应用?
  19. 微信小程序监听app.js中的globalData属性,
  20. 数据挖掘-关联规则挖掘之Apriori算法

热门文章

  1. ArkUI-1.OpenHarmony开发语言简介
  2. 网易html5新闻案例,网易新闻:今天,一起穿越回童年
  3. 入门版python实现独立成分分析法ICA
  4. 笔记本插上网线后没有自动连接网络的处理办法
  5. u盘里装linux系统软件,手把手教你在U盘里面安装一个LINUX系统
  6. 刚入手树莓派(rasberry pi)最基本的配置,最全!(烧录系统+配置ssh+换源+图文保姆级教程)
  7. 股票作手回忆录 摘录
  8. iOS-利用UIBezierPath和CAAnimation制作路径动画
  9. 如何让地面不起灰_水泥地面防起灰有什么办法? 水泥地面为什么会起灰?
  10. 常州计算机职称初定,常州职称评定流程