
上QQ阅读APP看书,第一时间看更新
2.2.2 属性
声明属性的完整语法如下:
var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>]
var声明的属性可以有getter和setter方法,val声明的属性只能有getter方法。
例如,在实际开发中,网络请求返回的Response大多采用如下形式:

对于调用HTTP接口,开发者经常需要封装一个基类的HttpResponse,用于表示接口返回的内容。下面的HttpResponse还额外定义了一个isOkStatus属性。

HttpResponse是一个范型类,它的属性isOkStatus用于判断接口调用是否成功。
另外,HttpResponse还是一个数据类(Data Class)。Data Class类似于Java Bean,它只包含一些数据字段,编译器能够自动生成属性的getter、setter。2.3.3小节会详细介绍Data Class。
幕后字段(backing field)
backing field是Kotlin属性自动生成的字段,它只能在当前属性的访问器(getter、setter)内部使用。另外,Kotlin的扩展属性不能使用backing field。
为何需要幕后字段?我们先来看一段代码:

当我们尝试获取paramValue的值时,上述代码会以递归的方式调用getter。类似地,当我们尝试设置paramValue的值时,它会以递归的方式调用相同的setter。
虽然Kotlin的类并没有field,但是Kotlin为每个属性提供了一个自动的backing field,可以使用field进行访问,便于在使用getter、setter时替换变量。

需要再一次强调,backing field只能在当前属性的访问器内使用。
最后,Kotlin的属性还包括内联属性、扩展属性、委托属性。这些属性的使用会在后续的章节中详细介绍。