这是我参与「第四届青训营 」笔记创作活动的第3天
此笔记用于记录Kotlin的进一步拾遗与新知识点学习记录,知识来源多为工作室项目代码。
1.有关Kotlin中变量定义后带?和!!的情况
?代表此变量可以为空并正常编译与执行,俗称空安全。
如var name:String? = "John" name=null 这样不会报错
如果var name:String = "John" name=null 这样后一句就会报错了
!!就是空不安全,检查指针是不是非空,空就抛异常
2.因为Kotlin中没有java里的静态方法,所以提供了 companion object
上csdn的链接blog.csdn.net/jingerlovex…
简单使用的话,就是能实现static的效果。
3.Kotlin中::的使用
简单的理解为引用一个过程而不是结果,有一点绕,不是很重要知道大概是这个意思就行了。比如在创建Intent的时候第二个参数就可以使用XXXX::class.java。
还是贴个链接www.jianshu.com/p/3d763a755…
4.ViewModel
见我的Jetpack学习笔记
5.关键字lateinit 和 lazy
因为Kotlin中类的属性一定要定义初始值,如果不想定义的话可以使用lateinit
比如private lateinit var name:String
//更正
lateinit和by lazy属于 懒加载 机制
详见www.jianshu.com/p/5fe384a25…
另外lateinit用于var,lazy用于val
其中注意到
private val heavyObject: HeavyClass by lazy {
println("Heavy Object initialised")
HeavyClass()
}
by lazy可以这么写,在后面用到,初始化的时候执行{}中内容。如果不是懒加载不知道是否也有这样的初始化附带函数,可能是后文所用到的作用域函数
6.inline、noinline和crossline
inline(内联函数)直白来讲,将调用此函数的地方用函数体替换。lamda中不允许使用return,但只在内联函数中允许。这样return一定结束外层的外层的函数。
在一个函数被循环多次调用的时候优化效果明显。
noinline 用于内联函数的参数函数,此参数函数在编译不用函数体替换。
crossinline 用于在函数内面临简介调用(如在子线程调用)的情形,这时参数lamda内不能使用return。
www.rengwuxian.com/kotlin-sour…
7.关于Kotlin中的run、let、apply等(作用域函数)
很幸运csdn有一篇写的非常好非常详细的博客。blog.csdn.net/eclipsexys/…
简单理解要知道这些方法是一个对象可以使用的方法,这个对象会执行{}内的函数,并按相应规则返回值或对象。
8.Kotlin摆脱findviewbyid
自己写项目的时候出现了奇怪的bug————findviewbyid明明编译没问题但运行时一直抛空指针
所以查了一下在build.gradle中plugins加上
id 'kotlin-android-extensions'
就可以摆脱findviewbyid直接在代码中使用组件id
更新:应该不重要了,毕竟基本都得用DataBinding的
9.Kotlin在非Activity类中调用Toast或Intent等
在非Activity类中没法用baseContext等获得Context,所以可以在使用这个类的Activity的companion object中声明一个lateinit的Activity变量,在oncreate中声明 变量名=this。然后在工具类中context的地方使用 Activity名.变量名
一般不会出现这种情况。
10.Kotlin中重写变量的get,set方法
由于Kotlin中,对于 对象.变量 本质上为调用 对象.get变量() 方法,所以可以重写变量的get()和set(value)方法,如下:
val number1: Int
get() = number2
这样调用 对象.number1 后永远返回number2