屬性
聲明屬性
Kotlin 類中的屬性既可以用關(guān)鍵字 var 聲明為可變的,也可以用關(guān)鍵字 val 聲明為只讀的。
class Address {
var name: String = "Holmes, Sherlock"
var street: String = "Baker"
var city: String = "London"
var state: String? = null
var zip: String = "123456"
}
要使用一個屬性霎终,只要用名稱引用它即可:
fun copyAddress(address: Address): Address {
val result = Address() // Kotlin 中沒有“new”關(guān)鍵字
result.name = address.name // 將調(diào)用訪問器
result.street = address.street
// ……
return result
}
Getters 與 Setters
聲明一個屬性的完整語法是
var <propertyName>[: <PropertyType>] [= <property_initializer>]
[<getter>]
[<setter>]
其初始器(initializer)、getter 和 setter 都是可選的。屬性類型如果可以從初始器 (或者從其 getter 返回值尤勋,如下文所示)中推斷出來,也可以省略茵宪。
var allByDefault: Int? // 錯誤:需要顯式初始化器最冰,隱含默認(rèn) getter 和 setter
var initialized = 1 // 類型 Int、默認(rèn) getter 和 setter
一個只讀屬性的語法和一個可變的屬性的語法有兩方面的不同:1稀火、只讀屬性的用 val開始代替var 2锌奴、只讀屬性不允許 setter
val simple: Int? // 類型 Int、默認(rèn) getter憾股、必須在構(gòu)造函數(shù)中初始化
val inferredType = 1 // 類型 Int 、默認(rèn) getter
我們可以為屬性定義自定義的訪問器箕慧。如果我們定義了一個自定義的 getter服球,那么每次訪問該屬性時都會調(diào)用它 (這讓我們可以實現(xiàn)計算出的屬性)。以下是一個自定義 getter 的示例:
val isEmpty: Boolean
get() = this.size == 0
如果我們定義了一個自定義的 setter颠焦,那么每次給屬性賦值時都會調(diào)用它斩熊。一個自定義的 setter 如下所示:
var stringRepresentation: String
get() = this.toString()
set(value) {
setDataFromString(value) // 解析字符串并賦值給其他屬性
}
按照慣例,setter 參數(shù)的名稱是 value伐庭,但是如果你喜歡你可以選擇一個不同的名稱粉渠。
自 Kotlin 1.1 起,如果可以從 getter 推斷出屬性類型圾另,則可以省略它:
val isEmpty get() = this.size == 0 // 具有類型 Boolean
如果你需要改變一個訪問器的可見性或者對其注解霸株,但是不需要改變默認(rèn)的實現(xiàn), 你可以定義訪問器而不定義其實現(xiàn):
var setterVisibility: String = "abc"
private set // 此 setter 是私有的并且有默認(rèn)實現(xiàn)