譯自《Coding Conventions》
該頁(yè)面包含Kotlin語(yǔ)言的當(dāng)前編碼風(fēng)格届宠。
命名風(fēng)格
如果有疑問,請(qǐng)默認(rèn)使用Java編碼約定乘粒,例如:
- 使用camelCase方式命名(并避免在名稱中使用下劃線)
- 類型以大寫開始
- 方法和屬性從小寫開始
- 使用4空格縮進(jìn)
- 公共函數(shù)應(yīng)該有文檔豌注,使其出現(xiàn)在Kotlin Doc中
冒號(hào)之前的空格
當(dāng)冒號(hào)分隔了類型和超類型(type and supertype)時(shí),冒號(hào)之前有一個(gè)空格灯萍;而當(dāng)冒號(hào)分隔實(shí)例和類型(instance and type)時(shí)轧铁,冒號(hào)之前沒有空格:
interface Foo<out T : Any> : Bar {
fun foo(a: Int): T
}
Lambda表達(dá)式
在lambda表達(dá)式中,大括號(hào)周圍應(yīng)該使用空格旦棉,且將參數(shù)與正文分開的箭頭周圍也應(yīng)該有空格齿风。 只要有可能药薯,一個(gè)lambda表達(dá)式應(yīng)該被傳遞到括號(hào)之外(passed outside of parentheses)。
list.filter { it > 10 }.map { element -> element * 2 }
在短而不嵌套的lambda中救斑,建議使用it
慣例童本,而不是明確聲明參數(shù)。 在具有參數(shù)的嵌套lambda中脸候,參數(shù)應(yīng)始終明確地聲明穷娱。
類頭格式化(Class header formatting)
有幾個(gè)參數(shù)的類可以寫成一行:
class Person(id: Int, name: String)
具有較長(zhǎng)類頭的類應(yīng)格式化,以使每個(gè)主構(gòu)造函數(shù)參數(shù)在單獨(dú)的行縮進(jìn)运沦。 此外泵额,右括號(hào)應(yīng)該在新的一行。 如果我們使用繼承携添,則超類構(gòu)造函數(shù)的調(diào)用(superclass constructor call)或?qū)崿F(xiàn)的接口列表應(yīng)位于與右括號(hào)相同的行上:
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name) {
// ...
}
對(duì)于多個(gè)接口嫁盲,超類構(gòu)造函數(shù)的調(diào)用(superclass constructor call)應(yīng)首先定位,然后每個(gè)接口應(yīng)位于不同的行中:
class Person(
id: Int,
name: String,
surname: String
) : Human(id, name),
KotlinMaker {
// ...
}
構(gòu)造函數(shù)參數(shù)可以使用常規(guī)縮進(jìn)或連續(xù)縮進(jìn)(雙倍的常規(guī)縮進(jìn))薪寓。
Unit
如果函數(shù)返回Unit亡资,則返回類型應(yīng)該省略:
fun foo() { // ": Unit" is omitted here
}
函數(shù)與屬性(Functions vs Properties)
在某些情況下澜共,沒有參數(shù)的函數(shù)可能與只讀屬性可互換(interchangeable )向叉。 雖然語(yǔ)義是相似的,但是有一些風(fēng)格約定(stylistic conventions)嗦董,決定什么時(shí)候更偏向某一個(gè)。
當(dāng)?shù)讓铀惴ǎ╱nderlying algorithm)滿足如下條件時(shí),屬性優(yōu)先于函數(shù):
- 不拋出異常(
throw
) - 具有
O(1)
復(fù)雜度 - 計(jì)算上容易(或者在第一次運(yùn)行后cache字裆臁)
- 多次調(diào)用返回相同的結(jié)果