译自《Coding Conventions》
该页面包含Kotlin语言的当前编码风格。
命名风格
如果有疑问,请默认使用Java编码约定,例如:
- 使用camelCase方式命名(并避免在名称中使用下划线)
- 类型以大写开始
- 方法和属性从小写开始
- 使用4空格缩进
- 公共函数应该有文档,使其出现在Kotlin Doc中
冒号之前的空格
当冒号分隔了类型和超类型(type and supertype)时,冒号之前有一个空格;而当冒号分隔实例和类型(instance and type)时,冒号之前没有空格:
interface Foo<out T : Any> : Bar {
fun foo(a: Int): T
}
Lambda表达式
在lambda表达式中,大括号周围应该使用空格,且将参数与正文分开的箭头周围也应该有空格。 只要有可能,一个lambda表达式应该被传递到括号之外(passed outside of parentheses)。
list.filter { it > 10 }.map { element -> element * 2 }
在短而不嵌套的lambda中,建议使用it
惯例,而不是明确声明参数。 在具有参数的嵌套lambda中,参数应始终明确地声明。
类头格式化(Class header formatting)
有几个参数的类可以写成一行:
class Person(id: Int, name: String)
具有较长类头的类应格式化,以使每个主构造函数参数在单独的行缩进。 此外,右括号应该在新的一行。 如果我们使用继承,则超类构造函数的调用(superclass constructor call)或实现的接口列表应位于与右括号相同的行上:
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name) {
// ...
}
对于多个接口,超类构造函数的调用(superclass constructor call)应首先定位,然后每个接口应位于不同的行中:
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name),
KotlinMaker {
// ...
}
构造函数参数可以使用常规缩进或连续缩进(双倍的常规缩进)。
Unit
如果函数返回Unit,则返回类型应该省略:
fun foo() { // ": Unit" is omitted here
}
函数与属性(Functions vs Properties)
在某些情况下,没有参数的函数可能与只读属性可互换(interchangeable )。 虽然语义是相似的,但是有一些风格约定(stylistic conventions),决定什么时候更偏向某一个。
当底层算法(underlying algorithm)满足如下条件时,属性优先于函数:
- 不抛出异常(
throw
) - 具有
O(1)
复杂度 - 计算上容易(或者在第一次运行后cache住)
- 多次调用返回相同的结果