1.Getters 和 Setters
聲明一個屬性的完整語法如下:
var <propertyName>: <PropertyType> [ = <property_initializer> ]
<getter>
<setter>
2.只讀屬性的聲明語法和可變屬性的聲明語法相比有兩點(diǎn)不同: 它以 val 而不是 var 開頭,不允許 setter 函數(shù):
val simple: Int? // 類型為 Int ,默認(rèn)實(shí)現(xiàn) getter ,但必須在構(gòu)造函數(shù)中初始化
val inferredType = 1 // 類型為 Int 類型,默認(rèn)實(shí)現(xiàn) getter
3.備用字段
在 kotlin 中類不可以有字段。然而當(dāng)使用自定義的訪問器時有時候需要備用字段。出于這些原因 kotlin 使用 field 關(guān)鍵詞提供了自動備用字段,
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() //參數(shù)類型是推導(dǎo)出來的
return _table ?: throw AssertionError("Set to null by another thread")
}
5.編譯時常量
那些在編譯時就能知道具體值的屬性可以使用 const 修飾符標(biāo)記為編譯時常量. 這種屬性需要同時滿足以下條件:
- 在top-level聲明的 或者 是一個object的成員(Top-level or member of an object)
- 以String或基本類型進(jìn)行初始化
- 沒有自定義getter
這種屬性可以被當(dāng)做注解使用:
const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated"
@Deprected(SUBSYSTEM_DEPRECATED) fun foo() { ... }