1.Getters 和 Setters
声明一个属性的完整语法如下:
var <propertyName>: <PropertyType> [ = <property_initializer> ]
<getter>
<setter>
2.只读属性的声明语法和可变属性的声明语法相比有两点不同: 它以 val 而不是 var 开头,不允许 setter 函数:
val simple: Int? // 类型为 Int ,默认实现 getter ,但必须在构造函数中初始化
val inferredType = 1 // 类型为 Int 类型,默认实现 getter
3.备用字段
在 kotlin 中类不可以有字段。然而当使用自定义的访问器时有时候需要备用字段。出于这些原因 kotlin 使用 field 关键词提供了自动备用字段,
var counter = 0 // 初始化值会直接写入备用字段
set(value) {
if (value >= 0)
field = value
}
4.备用属性
如果你想要做一些事情但不适合这种 "隐含备用字段" 方案,你可以试着用备用属性的方式:
rivate var _table: Map<String, Int>? = null
public val table: Map<String, Int>
get() {
if (_table == null)
_table = HashMap() //参数类型是推导出来的
return _table ?: throw AssertionError("Set to null by another thread")
}
5.编译时常量
那些在编译时就能知道具体值的属性可以使用 const 修饰符标记为编译时常量. 这种属性需要同时满足以下条件:
- 在top-level声明的 或者 是一个object的成员(Top-level or member of an object)
- 以String或基本类型进行初始化
- 没有自定义getter
这种属性可以被当做注解使用:
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
@Deprected(SUBSYSTEM_DEPRECATED) fun foo() { ... }