前情提要:这个笔记原本是记录在知乎上的,然而中间因为各种原因已经中断半年了。想要恢复的时候,却发现知乎网页端访问
各种坑,而且那边也一直不支持 Markdown,所以换到简书来试一下。
手头项目里有个在 JVM 上封装 DSL 的需求,在 Java 实现的数据流水线上插入 DSL 书写的业务逻辑。目前用的是 Jython,虽然可用,但是启动延迟、执行性能、内存占用都不是很理想,同时 Jython 项目本身目前的活跃程度堪忧。所以打算学习一下 Kotlin 看看是不是可以作为一个替代品。目前的计划是:
- 快速过一遍 Kotlin reference
- 阅读 Kotlin in Action 这本书的第 6 章类型系统和第 11 章 DSL 构建。
完成上述两个步骤之后,应该能够对 Kotlin 语言是个什么状态以及是否能够满足手头项目的需求有个比较准确的判断,然后再决定是否要继续深入。
开始吧。
基本语法的全景式介绍。看下来几个引起我注意的点:
- Kotlin 明显是门「时髦」的语言,几个新近流行起来的语法特性都有采纳:
- val a : Int 这样的类型后置声明。
- val a = 10 这样的隐式类型推导。
- Int 和 Int? 这样区分一个值是否可以为 null。
- var 和 val 这样区分一个值是否可以多次赋值。
- 无返回类型的函数,void 改成 Unit 了,不是很懂为啥要改以及为啥是 Unit。
-
String templates 是个很有意思的特性。字符串里面可以用
println("result = ${function_name($variable_name)}")
这样的语法来访问变量值甚至调用函数。第一反应是这玩意怎么实现的,是运行时调用 Kotlin 的编译器或者解释器吗?第二反应是如果函数带副作用会怎么样(试了一下println
,跑半天之后报错了)。后面还要细看。 - 类型检查之后自动把 Int? 转型到 Int ,或者把 Any 转型到具体类型是个不错的语法糖。当然编译器里面控制流分析一定要做好,不然出错了就好玩了。
- 所以这个情况下 Kotlin 怎么处理异常呢?好奇。
- 类的语法有些特别,构造参数直接写在类名后面。好奇它怎么处理需要多个不同构造函数的情况。
这一节看完,直观感受是「语法糖太多了吧!都有点齁了!」然后炼糖术好像不算顶尖的样子,有些语法糖感觉价值很小,比如Execute if not null:
val value = ...
value?.let {
... // execute this block if not null
}
这个和无糖版本比起来,简洁程度上毫无优势,还多引入了一个 let 特殊符号,目前感觉得不偿失:
val value = ...
if (value != null) {
... // execute this block if not null
}
另外最末尾的 TODO 函数想法不错,但是对又要引入 Nothing 作为新的一种特殊返回类型还是有点在意 ……
这一节没什么好说的,风格部分设计者说了算,最佳实践部分(比如 immutable over mutable)基本也都是共识。