對於Backing Field這個概念,在Java中是沒有的,是Kotlin中新引入的概念。我們先來看看它在什麼情況下使用:
class Person {
var username: String = "hello"
get() {
println("getter invoked...")
return field
}
set(value) {
println("setter invoked...")
field = value
}
}
要想理解Backing Field,首先要明確一點:在Java中,通常將域(成員變量,Field)和它的訪問器(Setter/Getter)聯合起來稱作是屬性(Property);但是在Kotlin中,屬性是作爲一級語言特徵,完全替代域和訪問器的概念。
舉個例子,我們定義一個類:
class User(val name: String, var age: Int)
然後我們在main函數中使用它:
fun main(args: Array<String>){
val user = User(“zhangsan”, 25)
println(user.name)
user.age = 29
println(user.age)
}
可以看出,無論是獲取還是改變這個User裏的age,從字面上看來都是age這個屬性,都是它本身,是把它當做是不可分割的整體。而在Java中,要想實現前面的一樣的效果,是需要有三部分:首先你得聲明一個成員變量(域),然後爲其生成對應的set、get方法才能實現讀取和更新的功能。
明確了這兩點之後,Backing Field的作用就可以體現了,類比到Java上,就是你聲明的那個成員變量,是真正存儲屬性值的地方