31

十分钟过一遍 Kotlin 知识点

 5 years ago
source link: https://mp.weixin.qq.com/s/vvJZq6ZS4-10CQchyLD-dg?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这是团队内部分享的Kotlin的知识点,还在不断完善的阶段。团队用Kotlin作为后端开发语言已经一年多,知识点还在不断的挖掘规范中。期待和更多的喜欢Kotlin的同学们一起讨论。

1:变量声明

val:只读变量,可以之后初始化,不过如果未初始化之前该变量无法使用,编译器会报错,编译成字节码的时候编译器应该会做优化,不建议之后初始化,什么时候用到什么时候定义。

Var:可变(略)

2:类型推导

kotlin虽然是一种强类型的jvm语言,一定程度上保证了类型安全,但是基于好的编码习惯,除非特别明显类似于val a = Example()这种,其他尽量不要省略类型,尤其一些函数,省略返回类型有时候可能会出现问题。

3:Array

case 1: val a:Array<Int> = arrayof(1,2,3)

case 2:val b:Array<Int> = Array(3,{k -> k*k})

4:import renaming

IbamEbU.jpg!web

import renaming可以使用,注意到是,如果重命名后,只能使用重命名之后的声明,和正常的import一样。

EneIVrJ.jpg!web

另外,有意思的是你可以重定义和重命名相同的名字,不过该文件内会优先选择import的声明。

5:range

a:闭区间(..)for:val range:IntRange= 1 .. 5 包括1和5

b:半开半闭区间(until)for:val range : IntRange = 1 until 5 包括1不包括5

6:异常

不同于Java,kotlin中所有的异常都是unchecked异常。

Checked异常:需要在声明中指出。

Unchec异常:不需要在声明中指出。

7:引用相等和结构相等

结构相等(==):默认会调用equal方法(如果不重写equal方法,Any默认的equal方法好像是判断引用是否相等)

引用相等(===):判断饮用指向的是否是同一实例

注意:结构相等对于null也是安全的,编译器会作null检查,如果都是null则返回true。

8:访问修饰符(默认public)

  1. public:默认修饰符,被其修饰的在任何位置都能访问

  2. private:只能在当前源文件内使用

  3. internal:在同一模块内使用

  4. protected:无效修饰符,只用于类和接口内

9:控制流作表达式

不同于Java,if .. else /try.. catch在kotlin中都是表达式,表达式意味着控制流可以直接作为右值。

10:自动类型转换

muueyeZ.jpg!web

rMna63v.jpg!web

11:显示类型转换(as)

as 转换失败会跑异常,所以使用as的时候要注意,这里可能会抛异常,如果不想抛异常,可以使用is,另外,as转换后可能会返回null,赋值编译器并不会帮你做检查,所以coding过程中要注意。Case如下:

zMjEjmy.jpg!web

12:when

when(arg):有点类似于穷举,判断当前arg处于哪个分支,在这里不要想着做所谓的bool判断,不支持,可以针对arg做bool判断,比如用in。

When:分支全是bool判断。

13:类型结构

Any:类似于Java的Objevt

Unit:不同于void,Unit也是一个实实在在的类型,只不过是singleton instane。

Nothing:所有类的子类。

14:构造函数

主构造函数:val/var可要可不要,如果不要则默认没有getter/setter方法,这块我觉得如果没有val/var其实就是传了个参数过去,class中并没有这个字段。

非主构造函数:val/var必须不要,一定要调用主构造函数。

15:初始化顺序(这里不考虑实力化过程中内存分配时的初始化,只是从kotlin语法上考究)

  • 字段初始化赋初值

  • init

  • 构造函数

与Java构造代码块不同的是,init有点类似于pre constructor,不比在乎字段是在init之前或者之后。

16:嵌套类

inner class:和外部类有关联,需要依赖于一个外部类实力,外部类一切对其可见。

static class:和外部类没什么关联,只是定义在外部类内部。

17:object /function/companion

其本质都是生成一个final类,其方法都被标注为static。

备注:这块没怎么研究,有时间可以看看字节码。

18:代理(by)

fERZ3aA.jpg!web

19:密闭类(可以理解成是类型的枚举,使用时需要该类型的实例)

JBrABjR.jpg!web

20:local functions(外部不可访问,作用域内变量对其都可见)

73eEfaV.jpg!web

21:函数默认参数

重写的时候必须完整的函数签名,且重写函数不允许再次指定参数默认值

22:扩展函数(成员扩展函数可以被重写,没什么需要特别注意的地方)

jA7JB3Y.jpg!web

23:函数字面量(值得注意的是如果参数可以推导出来可以省略)

uQvqqay.png!web

24:尾递归

如果函数定义中用到了递归,且返回值就是其递归调用,则可以采用尾递归,编译器会自动优化调用过程,采用迭代方式执行该调用,不至于产生那么多递归栈。

RfEJjme.jpg!web

25:varargs

如果该关键字标识的参数不是最后一个,则之后的参数要采用命名参数传递实参。

26:Spread operator

NRnAze7.jpg!web

27:Apply

28:Let

29:Run

mM7fAzV.jpg!web

30:Lazy

ZNnYNrm.jpg!web

31:Use

3AzeUrN.jpg!web

32:Repeat(从0开始)

33:require/assert/check

项目中这几个用的很少,一般都定义自己的require/assert/check进行相应的抛异常和处理操作。

34SAM( TODO )

35 top-level functions

编译器根据包名生成和包名同名的 class ,所有的函数都以 static 形式成为该 class 的成员函数。

36 :匿名函数

EnaA73R.jpg!web

37 :函数引用

6RJJ7ri.jpg!web

38 typealias

39   属性

Java 初始化构造快, kotlin init 用到的属性必须要先定义,否则无法在 init 块中使用。

40 :延迟初始化

  • 不能是基本类型

  • 不能自定义 getter/setter

  • 如果未赋值使用的话会抱异常

41 :代理属性( TODO

42 lazy initialization

JJZjQnY.jpg!web

用法有三种,详情都在上面,细节可以参考详细介绍,有时间可以仔细钻研一下。

buUFNrq.jpg!web

43:lazy versuslateinit

  • lazy只能用于val变量,lateinit只能用于var变量

  • lateinit不能用于null

44:Observables

YvaeMrY.png!web

用来监控属性变化和对属性进行约束

45:not-nullproperty delegate

JzuAz2i.jpg!web

感觉功能有点类似于lateinit

46:as[?]

不安全,转换不成功会抛异常,可以用as?,安全转换,如果转换不成功会返回null

47:Optional

不用多说

48:Upper Bounds

class UpperBoundsTest< T , V , X > where T :Comparable< X > , T :Serializable , V :Serializable , V :Comparable< X >

49:out/in

qqY7BfV.jpg!web

in用法省略,和out相同,继承语义和out正好相反。

zemIRbj.jpg!web

50:未完待续

编码规约建议

  1. kotlin非空断言(!!)尽量不要使用。

  2. 最好不要出现warning,如果有最好处理掉。

  3. 能用枚举的话最好用枚举,不要习惯使用字面量。

  4. 能用全局变量就用全局变量,最好不要全都用字面量。比如如果频繁的出现1000、10000可以用全局变量千/万来替代,可读性会更好。

  5. 建议使用统一的命名规范,比如grpc的实现采用统一的命名规则,模型层采用和数据表同名的方式,以便迅速定位哪个类属于数据表的模型实现,其他的业务也如此,便于查找相关联的业务。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK