代码约定
本文包含了 Kotlin 语言当前的编码风格。
命名风格
若有疑问,请默认使用Java编码约定,例如:
- 用驼峰命名法,并避免在名称中使用下划线
- 类型名以大写字母开头
- 方法和属性以小写字母开头
- 用4个空格缩进
- 公共方法应该配有说明文档
冒号
当冒号分隔了类型和超类型时冒号之前有一个空格;当冒号分隔实例和类型时冒号之前没有空格,:
interface Foo<out T : Any> : Bar {
fun foo(a: Int): T
}
Lambdas
在 lambda 表达式中,应该在大括号周围以及分割参数的箭头周围使用空格。只要有可能,一个lambda应该倍传递到括号之外。
list.filter { it > 10 }.map { element -> element * 2 }
在简短并且不嵌套的lambdas中,建议使用 it
约定 而不是明确声明参数;
在具有参数的嵌套lambdas中, 参数应始终明确声明。
类头部格式化
有较少几个参数的类可以写成一行
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
如果一个函数返回 Unit
, 返回值类型可以省略不写:
fun foo() { // ": Unit" 被省略了
}
函数 VS 属性
在某些情况下,没有参数的函数可能 可以和 只读属性 互换。
虽然语义是相似的,但是有一些风格约定是倾向于其中一个的。
在基础算法中,倾向于属性而非方法:
- 不抛出错误
- 有一个
O(1)
的复杂度 - 易于计算
- 返回结果与调用结果相同