Kotlin 中的支持领域

支持字段是编程语言 Kotlin 中引入的一个概念,一个简单但被遗忘的概念,您应该了解一下。

你将学到什么:

  1. Kotlin 的支持领域是什么?
  2. 为什么我们需要一个支持字段?
  3. 它是什么时候创建的?

在回答这些问题之前,让我们介绍一下 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通过将其设为私有来隐藏其属性并创建访问器来管理获取和设置值。

让我们分解一下:

  1. 首先,我们需要一个本地属性来在其中设置一个值。
  2. 我们需要一个本地属性来从中获取值。
  3. 如果我们不在任何访问器中使用本地属性,那么我们就不需要本地属性。

如下所示,我们不需要存储名称值,因为我们通过连接第一个和第二个名称来计算它,因此我们不需要该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修饰符,如上例所示。

让我们回答问题:

  1. Kotlin 中的 Backing 字段是什么? backing field 目的是存储属性值,可以把它想象成一个盒子,当你给一个属性设置一个值时,它会在这个盒子里设置值,当你尝试获取值时,它会获取存储在这个盒子里的值. 就像在 java 中一样,当我们student.getName()在函数内部调用时,我们返回name值,与student.setName(“anyName”).

  2. 为什么我们需要 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 引入了字段修饰符来引用属性框来获取和设置值。

  1. 它是什么时候创建的?
    如果您考虑 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、支持字段用于防止属性访问器函数的递归调用。

ღ( ´・ᴗ・` )比心

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值