投稿

十分钟过一遍Kotlin知识点

待字闺中2018-07-06 15:28:47
1:变量声明
 
val:只读变量,可以之后初始化,不过如果未初始化之前该变量无法使用,编译器会报错,编译成字节码的时候编译器应该会做优化,不建议之后初始化,什么时候用到什么时候定义。
 
Var:可变(略)
 
2:类型推导
 
kotlin虽然是一种强类型的jvm语言,一定程度上保证了类型安全,但是基于好的编码习惯,除非特别明显类似于val a = Example()这种,其他尽量不要省略类型,尤其一些函数,省略返回类型有时候可能会出现问题。
 
3:Array
 
case 1: val a:Array = arrayof(1,2,3)
 
case 2:val b:Array = Array(3,{k -> k*k})
 
4:import renaming
 
import renaming可以使用,注意到是,如果重命名后,只能使用重命名之后的声明,和正常的import一样。
 
另外,有意思的是你可以重定义和重命名相同的名字,不过该文件内会优先选择import的声明。
 
5:range
 
a:闭区间(..)for:val range:IntRange= 1 .. 5 包括1和5b:半开半闭区间(until)for:val range : IntRange = 1 until 5 包括1不包括56:异常
 
不同于Java,kotlin中所有的异常都是unchecked异常。
 
Checked异常:需要在声明中指出。
 
Unchec异常:不需要在声明中指出。
 
7:引用相等和结构相等
 
结构相等(==):默认会调用equal方法(如果不重写equal方法,Any默认的equal方法好像是判断引用是否相等)引用相等(===):判断饮用指向的是否是同一实例注意:结构相等对于null也是安全的,编译器会作null检查,如果都是null则返回true。
 
8:访问修饰符(默认public)
 
public:默认修饰符,被其修饰的在任何位置都能访问private:只能在当前源文件内使用
 
internal:在同一模块内使用
 
protected:无效修饰符,只用于类和接口内
 
9:控制流作表达式
 
不同于Java,if .. else /try.. catch在kotlin中都是表达式,表达式意味着控制流可以直接作为右值。
 
10:自动类型转换
 
11:显示类型转换(as)
 
as转换失败会跑异常,所以使用as的时候要注意,这里可能会抛异常,如果不想抛异常,可以使用is,另外,as转换后可能会返回null,赋值编译器并不会帮你做检查,所以coding过程中要注意。Case如下:
 
data-src="/mp/newappmsgvote?action=show&__biz=MjM5ODIzNDQ3Mw==&supervoteid=453232949#wechat_redirect" data-supervoteid="453232949" allowfullscreen="">
 
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)
 
19:密闭类(可以理解成是类型的枚举,使用时需要该类型的实例)20:local functions(外部不可访问,作用域内变量对其都可见)21:函数默认参数
 
重写的时候必须完整的函数签名,且重写函数不允许再次指定参数默认值22:扩展函数(成员扩展函数可以被重写,没什么需要特别注意的地方)23:函数字面量(值得注意的是如果参数可以推导出来可以省略)24:尾递归
 
如果函数定义中用到了递归,且返回值就是其递归调用,则可以采用尾递归,编译器会自动优化调用过程,采用迭代方式执行该调用,不至于产生那么多递归栈。
 
25:varargs
 
如果该关键字标识的参数不是最后一个,则之后的参数要采用命名参数传递实参。
 
26:Spread operator
 
27:Apply
 
28:Let
 
29:Run
 
30:Lazy
 
31:Use
 
32:Repeat(从0开始)
 
33:require/assert/check
 
项目中这几个用的很少,一般都定义自己的require/assert/check进行相应的抛异常和处理操作。
 
34:SAM(TODO)
 
35:top-level functions
 
编译器根据包名生成和包名同名的class,所有的函数都以static形式成为该class的成员函数。
 
36:匿名函数
 
37:函数引用
 
38:typealias
 
39: 属性
 
同Java初始化构造快,kotlin init用到的属性必须要先定义,否则无法在init块中使用。
 
40:延迟初始化
 
不能是基本类型
 
不能自定义getter/setter
 
如果未赋值使用的话会抱异常
 
41:代理属性(TODO )
 
42:lazy initialization
 
用法有三种,详情都在上面,细节可以参考详细介绍,有时间可以仔细钻研一下。
 
43:lazy versuslateinit
 
lazy只能用于val变量,lateinit只能用于var变量
 
lateinit不能用于null
 
44:Observables
 
用来监控属性变化和对属性进行约束
 
45:not-nullproperty delegate
 
感觉功能有点类似于lateinit
 
46:as[?]
 
 不安全,转换不成功会抛异常,可以用as?,安全转换,如果转换不成功会返回null47:Optional
 
不用多说
 
48:Upper Bounds
 
class UpperBoundsTest<T,V,X> where T:Comparable<X>,T:Serializable,V:Serializable,V:Comparable<X>
 
49:out/in
 
in用法省略,和out相同,继承语义和out正好相反。
 
50:未完待续
 
编码规约建议
 
kotlin非空断言(!!)尽量不要使用。
 
最好不要出现warning,如果有最好处理掉。
 
能用枚举的话最好用枚举,不要习惯使用字面量。
 
能用全局变量就用全局变量,最好不要全都用字面量。比如如果频繁的出现1000、10000可以用全局变量千/万来替代,可读性会更好。
 
建议使用统一的命名规范,比如grpc的实现采用统一的命名规则,模型层采用和数据表同名的方式,以便迅速定位哪个类属于数据表的模型实现,其他的业务也如此,便于查找相关联的业务。
 

喜欢|0 不喜欢|0
来源:待字闺中
原标题:十分钟过一遍Kotlin知识点
版权申明:本文经授权发布,不代表本站立场。如若转载请联系原作者。

相关文章

审视数字加密货币背后的阴暗、肮脏与风险
世界第一“挖矿大国”,比特币全网近90%算力已被中国公司掌控
交易挖矿临界点将至,是毁灭还是未来?
“交易挖矿”的市场竞争逻辑深度解析
交易即挖矿模式市场不买账了?FT、CET之后又一只类似平台币遭资金出货