编码规范
无冲突的地方默认使用Java的编码风格
使用驼峰法命名(并避免命名含有下划线)
类型名以大写字母开头
方法和属性以小写字母开头
使用 4 个空格缩进
公有函数应撰写函数文档,这样这些文档才会出现在 Kotlin Doc 中
冒号
类型和超类型之间的冒号前要有一个空格,而实例和类型之间的冒号前不要有空格:
interface Foo<out T : Any> : Bar {
fun foo(a: Int): T
}
Lambda表达式
在lambda表达式中, 大括号左右要加空格,分隔参数与代码体的箭头左右也要加空格 。lambda表达应尽可能不要写在圆括号中
list.filter { it > 10 }.map { element -> element * 2 }
在非嵌套的短lambda表达式中,最好使用约定俗成的默认参数 it
来替代显式声明参数名 。在嵌套的有参数的lambda表达式中,参数应该总是显式声明。
Unit
如果函数返回 Unit 类型,该返回类型应该省略:
fun foo() { // 省略了 ": Unit"
}
函数还是属性
很多场合无参的函数可与只读属性互换。 尽管语义相近,也有一些取舍的风格约定。
底层算法优先使用属性而不是函数:
- 不会抛异常
- O(1) 复杂度
- 计算廉价(或缓存第一次运行)
- 不同调用返回相同结果
类头的格式
放在类相关的内容中
包和导入
包
源文件通常以包声明开头:
package foo.bar
fun baz() {}
class Goo {}
// ……
源文件所有内容(无论是类还是函数)都包含在声明的包内。 所以上例中 baz() 的全名是 foo.bar.baz、Goo 的全名是 foo.bar.Goo。
如果没有指明包,该文件的内容属于无名字的默认包。
导入
除了默认导入之外,每个文件可以包含它自己的导入指令。 导入语法在语法中讲述。
可以导入一个单独的名字,如.
import foo.Bar // 现在 Bar 可以不用限定符访问
也可以导入一个作用域下的所有内容(包、类、对象等):
import foo.* // “foo”中的一切都可访问
如果出现名字冲突,可以使用 as 关键字在本地重命名冲突项来消歧义:
import foo.Bar // Bar 可访问
import bar.Bar as bBar // bBar 代表“bar.Bar”
关键字 import 并不仅限于导入类;也可用它来导入其他声明:
- 顶层函数及属性
- 在对象声明中声明的函数和属性;
- 枚举常量
与 Java 不同,Kotlin 没有单独的 “import static” 语法; 所有这些声明都用 import 关键字导入。