为什么要来学习Kotlin原因:在17年5月左右,Flipboard中国的Android项目确定了正式将Kotlin作为项目开发语言,这就意味着新增的代码文件将以Kotlin代码格式出现,而且同时旧的Java代码也将会陆陆续续翻译成Kotlin代码。
什么是Kotlin
- Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。
- Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。
- JetBrains,作为目前广受欢迎的Java IDE IntelliJ 的提供商,在 Apache 许可下已经开源其Kotlin
编程语言。 - Kotlin已正式成为Android官方支持开发语言。
Kotlin是JVM和Android的实用编程语言,结合了OO和功能特性,专注于互操作性,安全性,清晰度和工具支持。
作为通用语言,Kotlin 可以在Java工作的地方工作:服务器端应用程序,移动应用程序(Android),桌面应用程序。它适用于所有主要的工具和服务,如
IntelliJ IDEA,Android Studio和Eclipse
Maven,Gradle和Ant
Spring Boot (Kotlin支持!)
GitHub,Slack甚至Minecraft :
Kotlin的关键重点之一是混合Java + Kotlin项目的互操作性和无缝支持,使采用更容易,从而减少了样板代码和更多的类型安全性。此外,Kotlin有一个广泛的标准库,使日常任务轻松流畅,同时保持字节码足迹低。当然,也可以在Kotlin中使用任何Java库。反之亦然。
设计目标
创建一种兼容Java的语言
让它比Java更安全,能够静态检测常见的陷阱。如:引用空指针
让它比Java更简洁,通过支持variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation等实现。
让它比最成熟的竞争对手Scala语言更加简单。
与 java 的对比
Kotlin 修复了 java 的一系列问题
- Null 引用交给了类型系统控制
- 没有 raw 类型
- Arrays 在 kotlin 中是不变的
- kotlin 有合适的函数类型,作为 java SAM 转换的反对。(Kotlin has proper function types,
as opposed to Java’s SAM-conversions) - [Use-site variance](Use-site variance without wildcards) without
wildcards Kotlin 不强制检查异常
java 有的而 kotlin 没有
- 异常检查
- 原始类型不是类
- 静态成员
- 非私有成员
- 通配符类型
kotlin 有的而 java 没有
- Lambda表达式+内联函数=高性能自定义控制结构
- 扩展函数
- Null-safety
- Smart casts
- String templates字符串模板
- Properties属性
- Primary constructors主构造函数
- First-class delegation
- Type inference for variable and property types类型推断变量和属性的类型
- Singletons单例
- Declaration-site variance & Type projections声明变量和类型预测
- Range expressions范围表达式
- Operator overloading操作符重载
- Companion objects同伴的对象
- Data classes数据类
- Separate interfaces for read-only and mutable collections不同的接口为只读和可变集合
- Coroutines协同程序
与 Scala 对比
Kotlin 设计时的俩个主要目标是:
- 至少和 java 运行速度一样快
- 在保证语言尽量简单的情况下在易用性上提高
考虑到这俩点,如果你喜欢 Scala ,你可能不需要 Kotlin
Scala 有而 Kotlin 没有的
- 隐式转换,隐式参数 –在 Scala 中,在不适用 debugger 的时候很难知道代码发生了什么,因为太多的东西是隐式的–通过函数增加类型在 kotlin 中需要使用扩展函数
- 可重载和类型成员
- 路径依赖的类型
- Existential types –类型推断是很特殊的情形
- 特征的初始化逻辑很复杂 –参看类和继承
- 自定义象征操作 –参看操作符重载
- 内建 xml –参看Type-safe Groovy-style builders
以后 kotlin可能会添加的特性:
- 结构类型
- 值类型
- Yield 操作符
- Actors
- 并行集合(Parallel collections
Kotlin 有而 Scala 没有的
- 零开销的null安全
- Scala的是Option,是在句法和运行时的包装
- Smart casts
- Kotlin 的内联函数非局部的跳转
- First-class delegation。也通过第三方插件:Autoproxy实现
代码风格
命名风格
默认为Java编码约定,比如:
- 使用骆驼命名法(在命名中避免下划线)
- 类型名称首字母大写
- 方法和属性首字母小写
- 缩进用四个空格
- public 方法要写说明文档,这样它就可以出现在 Kotllin Doc 中
冒号
在冒号区分类型和父类型中要有空格,在实例和类型之间是没有空格的:
interface Foo<out T : Any> : Bar {
fun foo(a: Int): T
}
在 Lambdas 表达式中,大括号与表达式间要有空格,箭头与参数和函数体间要有空格。尽可能的把 lambda 放在括号外面传入
list.filter { it > 10 }.map { element -> element * 2 }
在使用简短而非嵌套的lambda中,建议使用it而不是显式地声明参数。在使用参数的嵌套lambda中,参数应该总是显式声明
类声明格式
参数比较少的类可以用一行表示:
class Person(id: Int, name: String)
具有较多的参数的类应该格式化成每个构造函数的参数都位于与缩进的单独行中。此外,结束括号应该在新行上。如果我们使用继承,那么超类构造函数调用或实现的接口列表应该位于与括号相同的行中
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name) {
// ...
}
对于多个接口,应该首先定位超类构造函数调用,然后每个接口应该位于不同的行中
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name),
KotlinMaker {
// ...
}
构造函数参数可以使用常规缩进或连续缩进(双倍正常缩进)。
如果函数返回 Unit ,返回类型应该省略:
fun foo() { // ": Unit"被省略了
}
函数 vs 属性
在某些情况下,没有参数的函数可以与只读属性互换。尽管语义是相似的,但是有一些风格上的约定在什么时候更偏向于另一个。
在下面的情况下,更偏向于属性而不是一个函数:
- 不需要抛出异常 – 拥有O(1)复杂度
- 低消耗的计算(或首次运行结果会被缓存)
- 返回与调用相同的结果