十分钟过一遍 Kotlin 知识点

这是团队内部分享的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

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

另外,有意思的是你可以重定义和重命名相同的名字,不过该文件内会优先选择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:自动类型转换

11:显示类型转换(as)

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

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?,安全转换,如果转换不成功会返回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

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

50:未完待续

编码规约建议

  1. kotlin非空断言(!!)尽量不要使用。
  2. 最好不要出现warning,如果有最好处理掉。
  3. 能用枚举的话最好用枚举,不要习惯使用字面量。
  4. 能用全局变量就用全局变量,最好不要全都用字面量。比如如果频繁的出现1000、10000可以用全局变量千/万来替代,可读性会更好。
  5. 建议使用统一的命名规范,比如grpc的实现采用统一的命名规则,模型层采用和数据表同名的方式,以便迅速定位哪个类属于数据表的模型实现,其他的业务也如此,便于查找相关联的业务。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月20日

ThinkPHP5快速入门

ThinkPHP5快速入门目 录零、序言一、基础二、URL和路由三、请求和响应四、数据库五、查询语言六、模型和关联 (1)模型定义 (2)基础操作 (3)读取器和修改器 (4)类型转换和自动完成 (5)查询范围 (6)输入和验证 (7)关联 (8)模型输出七、视图和模板八、调试和日志九、API开发十、命令行工具十一、扩展十二、杂项SessionCookie验证

ThinkPHP5快速入门基础

ThinkPHP5快速入门基础一、基础快速入门 ( 一 ) :基础本章介绍了 ThinkPHP5 .0 的安装及基本使用 ,并给出了一个最简单的示例带你了解如何开始开发 ,主要包 含 :简介官网下载 omposer安装和更新CGit下载和更新目录结构运行环境入口文件调试模式控制器视图读取数据总结在学习 ThinkPHP5.0 之前 ,如果你还不理解面向对象和命名空间的概念 ,建议首先去PHP手册恶

热门专题

昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
易捷尔单招|易捷尔单招,易捷尔单招培训,易捷尔单招报名,易捷尔单招考试,易捷尔单招培训学校,易捷尔单招分数
易捷尔单招
一年制中专|中专学历,中专是什么学历,中专是什么,中专有什么专业,中专升大专,一年制中专
一年制中专
APP开发|app开发_app开发公司_app软件开发_专业app开发_云南app开发公司_app定制_原生app开发定制
APP开发
大理科技管理学校|大理科技管理学校,大理科技,大理科技中等职业技术学校,大理科技管理中等职业技术学校,大理科技学校
大理科技管理学校
中源管业|中源管业,中源管业公司,中源管业有限公司,中源管业电话,中源管业地址,中源管业电力管,中源管业mpp电力管,中源管业cpvc电力管,中源管业pe穿线管
中源管业
外贸网站建设|外贸网站建设,英文网站制作,英文网站设计,美国主机空间,外贸建站平台,多语言网站制作
外贸网站建设
大理科技管理学校|大理科技管理中等职业技术学校,大理市科技管理中等职业技术学校
大理科技管理学校

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部