标识符
标识符就是变量、常量、函数、属性、类、接口和扩展等由程序员指定的名字。构成标识符的字符均有一定的规范,Kotlin 语言中标识符的命名规则如下:
- 区分大小写:Myname 与 myname 是两个不同的标识符。
- 首字符,可以是下划线(_)或字母,但不能是数字。
- 除首字符外其他字符,可以是下划线(_)、字母和数字。
- 硬关键字(Hard Keywords)不能作为标识符,软关键字(Soft Keywords)、修饰符关键字(Modifier Keywords)在它们的适用场景之外可以作为标识符使用。
- 特定标识符 field 和 it。在 Kotlin 语言中有两个由编译器定义的特定标识符,它们只能在特定场景中使用有特定的作用,而在其他的场景中可以做标识符使用。
提示 如果一定要使用关键字作为标识符,可以在关键字前后添加反引号(`)。另外,Kotlin语言中字母采用的是双字节 Unicode 编码。Unicode 叫作统一编码制,它包含了亚洲文字编码,如中文、日文、韩文等字符。
关键字
关键字是类似于标识符的保留字符序列,由语言本身定义好的,Kotlin 语言中有 70 多个关键字,全部是小写英文字母,以及 ! 和 ? 等字符构成。分为 3 个大类:
- 硬关键字(Hard Keywords),硬关键字如何情况下都不能作为关键字,具体包括如下关键字。
as、as?、break、class、continue、do、else、false、for、fun、if、in、!in、interface、is、!is、null、object、package、return、super、this、throw、true、try、typealias、val、var、when和while。 - 软关键字(Soft Keywords),软关键字是在它适用场景中不能作为标识符,而其他场景中可以作为标识符,但为例避免误解,一般也不会这么用。具体包括如下关键字。
by、catch、constructor、delegate、dynamic、field、file、finally、get、import、init、param、property、receiver、set、setparam 和 where。 - 修饰符关键字(Modifier Keywords),修饰符关键字是一种特殊的软关键字,它们用来修饰函数、类、接口、参数和属性等内容,在此场景中不能作为标识符。而其他场景中可以作为标识符,具体包括如下关键字。
abstract、annotation、companion、const、crossinline、data、enum、external、final、infix、inner、internal、lateinit、noinline、open、operator、out、override、private、protected、public、reified、sealed、suspend、tailrec 和 vararg。
in 和 !in 关键字
判断一个数值是否在区间中可以使用in关键字。而 !in 关键字,则是判断一个值不在区间中。此外,这两个关键字(in和!in)还可以判断一个数值是否集合或数组中。
val score = 50
if (score !in 60..100) { //使用!in关键字
println("不及格")
}
val strArray = arrayOf("刘", "关", "张")
val name = "赵"
if (name !in strArray) {
println(name + "不在队伍中")
}
注释
Kotlin 程序有 3 类注释:单行注释(//)、多行注释(/.../)和文档注释(/*.../)。注释方法与 Java 语言都类似。
// This is an end-of-line comment
/* This is a block comment
on multiple lines. */
Kotlin 中的块注释可以嵌套。
/* The comment starts here
/* contains a nested comment */
and ends here. */
代码规范
一行代码的长度应尽量不要超过 80 个字符,如果超过则需断行,可以依据下面的一般规范断开:
- 在一个逗号后面断开。一个运算符前面断开,要选择较高级别的运算符(而非较低级别的运算符)断开。
下面通过一些示例说明:
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longName6 // ①
longName1 = longName2 * (longName3 + longName4
- longName5) + 4 * longName6 //②
fun format(obj: Any, toAppendTo: StringBuffer,
fieldPosition: FieldPosition): StringBuffer { //③
...
}
if ((longName1 == longName2)
|| (longName3 == longName4) && (longName3 > longName4)
&& (longName2 > longName5)) { //④
}
- 上述代码第 ① 行和第 ② 行是带有小括号运算的表示式,其中代码第 ① 行的断开位置要比第 ② 行的断开位置要好。因为代码第①行断开处位于括号表达式的外边,这是个较高级别的断开。
- 代码第 ③ 行函数名断开是在参数逗号之后。
- 代码第 ④ 行是 if 等判断结构表达式中,由于可能有很多长的条件表达式,断开的位置应在逻辑运算符处。