支持字段是编程语言 Kotlin 中引入的一个概念,一个简单但被遗忘的概念,您应该了解一下。
你将学到什么:
- Kotlin 的支持领域是什么?
- 为什么我们需要一个支持字段?
- 它是什么时候创建的?
在回答这些问题之前,让我们介绍一下 JAVA 处理类属性声明和初始化的方式,以及我们如何处理隐藏在类中的数据。
JAVA中的属性:
让我们声明一个Student具有一些相关属性的类:
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
正如我们所看到的,一种非常简单的方法来声明具有属性的类并控制其状态值,我们name通过将其设为私有来隐藏其属性并创建访问器来管理获取和设置值。
让我们分解一下:
- 首先,我们需要一个本地属性来在其中设置一个值。
- 我们需要一个本地属性来从中获取值。
- 如果我们不在任何访问器中使用本地属性,那么我们就不需要本地属性。
如下所示,我们不需要存储名称值,因为我们通过连接第一个和第二个名称来计算它,因此我们不需要该name属性。
public class Student {
// private String name; ---> no need for the name property.
private String firstName;
private String lastName;
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getName() {
return firstName + " " + secondName ;
}
}
让我们转到 Kotlin:
Kotlin 是一种简洁的语言,它可以为您节省样板代码,并通过为我们生成一些开箱即用的代码来帮助我们。
要声明一个Student具有 name 属性的类,您所要做的就是:
class Student(private val name: String)
酷,对😎
但幕后发生了什么?
Kotlin 会生成获取和设置属性值的访问器函数,同时它为您提供了自定义访问器逻辑的机制,因此要实现前面的 Java 示例,我们需要执行以下操作:
class Student (private val firstName: String, private val secondName: String){
val name: String
get() = "$firstName $secondName"
}
如何参考Backing字段?
让我们举个例子:
class Student {
var age: Int = 0
get() = 2022 - field
set(value) {
field = value
}
}
要引用支持字段,您需要使用field修饰符,如上例所示。
让我们回答问题:
-
Kotlin 中的 Backing 字段是什么? backing field 目的是存储属性值,可以把它想象成一个盒子,当你给一个属性设置一个值时,它会在这个盒子里设置值,当你尝试获取值时,它会获取存储在这个盒子里的值. 就像在 java 中一样,当我们student.getName()在函数内部调用时,我们返回name值,与student.setName(“anyName”).
-
为什么我们需要 Kotlin 中的 backing field? 为什么我不能直接引用属性名称?
class Student {
var age: Int = 0
get() = 2022 - age <---
set(value) {
age = value <---
}
}
Kotlin 简化了我们调用属性的方式,因此我们可以直接按名称调用属性并做任何我们想做的事情,而不是调用 getter 或 setter,所以如果我像上面一样直接使用 getter 中的属性,我正在调用获取age价值的吸气剂对吗?如果是这样,getter 将看到它内部再次调用 age 等等,因此无限递归调用将导致 StackOverflow 异常。
class Student {
var age: Int = 0
get() = 2022 - age <--- call get() for age property
set(value) {
age = value <--- call set() for age property
}
}
为了利用 kotlin 属性,避免 StackOverFlow,kotlin 引入了字段修饰符来引用属性框来获取和设置值。
- 它是什么时候创建的?
如果您考虑 java 示例,您会看到,student.name如果我们需要在 getter 中获取它的值,或者在 setter 中设置一个值,我们需要一个本地属性。
Kotlin 也不例外:
- 如果您使用至少一个默认访问器(get、set),kotlin 将生成一个支持字段,因为它需要一个框来存储或检索值。
private var age: Int = 27 <-- we are using the default get and set methods.
private var age: Int
get() = 27 <-- we are using the default set method, so a backing field will be created for you.
- 如果您在自定义访问器中引用字段修饰符,kotlin 将为您生成一个支持字段。
private val age: Int
get() = 2022 - field
结论:
1、支持字段就像一个盒子,被创建为您设置或从中获取价值。
2、Kotlin 将在以下情况下为您创建它:
-
至少使用一种默认访问器函数(get、set)。
-
使用访问器内的字段修饰符引用支持字段。
3、支持字段用于防止属性访问器函数的递归调用。
ღ( ´・ᴗ・` )比心