最近在着手写一个TornadoFx的项目,接触了之前从未写过的Kotlin,吃到了大量的语法糖,给我一种“到处充满了Lambda”的既视感。
很多东西一个花括号就能搞定,隐藏了很多“当场实现接口”、“覆写方法”的繁琐语法,确实写起来非常的舒服,写篇文章总结一下。
目前来说,我体会到的主要有这些语法糖:
- 构造块
替代了构造函数,而Java中的有参构造被移到了类名右边的圆括号内:
1 | //java |
顺带提一下延迟加载,Kotlin要求显式声明在声明时不赋值的变量:
(读起来可能有点拗口,意思是默认情况下如果变量声明不赋值,是一个编译期错误)
1 | //编译错误:Property must be initialized or be abstract |
只有加入lateinit 关键字才允许之后在其他地方赋值:
1 | lateinit var bo:XXXBo; |
延迟加载机制能和DI框架很好的配合,虽然Spring的写法是这样的:
1 | var bo:XXXBo by di(); |
需要和延迟加载区分的一个机制是懒加载,代码是这样的:
1 | val bo by lazy{ |
注意,懒加载用于val变量,一个非常对口的应用场景就是单例模式,如果在单例模式中使用lateinit虽然也可以实现,但是会增加不必要的逻辑。
- 分号省略
代码略;每一行代码的分号可以省略,(不知道编译那边是怎么做的……)
- 类型推断+使用var来声明变量
这个在类名很长的时候兼职就是拯救世界……
1 | //java |
- 进一步简化的try-with-resource
1 | //java6 |
这个use()方法本质是调用close()方法,见这个回答
- 对NPE进行了最大限度的消除:强制null检查
1 | //java |
- 对Get/Set进行最大程度的消除(数据类):
Java里其实有个叫Lombok的东西干了差不多的事,在编译器自动生成Getter Setter equals() toString()这么些方法。
不过Kotlin里调用get/set方法也可以不用方法名,而是直接.属性名。
顺带一提,Kotlin的主方法由于没有static方法,用的是伴生对象,并且方法加入@JvmStatic注解。
不过IDEA似乎没法用psvm来快速生成了,也不知道是复杂了还是简单了(
1 | //java |
- 语言层面的TODO支持:
1 | //java |
- KDoc(对位JavaDoc)支持Markdown语法
详见链接