📜  Kotlin 中的“const”和“val”有什么区别?

📅  最后修改于: 2022-05-13 01:54:46.530000             🧑  作者: Mango

Kotlin 中的“const”和“val”有什么区别?

在 Kotlin 中,与在其他编程语言中一样,属性可以是可变的(可变的)或不可变的(不可改变的)。为了声明一个不可变的属性,我们使用了 const 和 val 这两个术语。开发人员经常对何时使用这些短语之一感到困惑。在本文中,我们将研究 Kotlin 中 const 和 val 之间的区别。

在 Kotlin 中使用“const”

const 关键字用于声明本质上不可变的属性,即只读属性。这些值仅在运行时已知,因此,在运行时不能将值分配给 const 变量。要成为 const 属性,属性必须满足以下要求:

  1. 必须是在顶层或对象或伴侣对象的成员。
  2. 应该从原始数据类型开始
  3. 没有自定义 getter 因此,您不能将 const 变量分配给函数或类,因为该变量将在运行时而不是编译时初始化。

Kotlin 中“val”的使用

const 和 val 之间的主要区别是 val 属性也可以在运行时初始化。因此,您可以将 val 变量分配给方法或类。

例子:

Kotlin
const val gfgName = "Geeksforgeeks" // goes well
val coursename = "Android" // goes well
   
const val gfgName = getgfgName() // not goes well
val coursename = getcoursename() // not goes well


Kotlin
GeeksforGeeksClass {
    companion object {    
        const val IMAGE_EXTENSION = ".jpg"    
        val LOGONAME: String
        get() = "Geeks" + System.currentTimeMillis() + IMAGE_EXTENSION 
    }
}


Kotlin
public final String getIMAGENAME() {
   return "Geeks" + System.currentTimeMillis() + ".jpg";
}


上面例子中的不可变变量是 gfgName。使用const时,直接赋值即可;但是,尝试从某个函数getgfgame 分配值将导致错误,因为该值将在运行时而不是编译时分配。但是,在 val 的情况下,这两种情况都是可以接受的。

当“val”就足够时,为什么要使用“const”?

我们在上一个例子中看到 val 变量的值在运行时被初始化,而在编译时被初始化。那么,当 val 就足够了时,为什么要使用 const 呢?让我们看另一个真实的 Android 示例,看看如何使用 const 和 val:

科特林

GeeksforGeeksClass {
    companion object {    
        const val IMAGE_EXTENSION = ".jpg"    
        val LOGONAME: String
        get() = "Geeks" + System.currentTimeMillis() + IMAGE_EXTENSION 
    }
}

因为文件扩展名总是相同的,所以它被定义为一个 const 变量。但是,文件名将根据我们申请文件名的理由进行修改。在本例中,我们以当前时间命名文件。您不能一开始就给它一个值,因为该值是在运行时获得的。所以我们将在这里使用 val。

科特林

public final String getIMAGENAME() {
   return "Geeks" + System.currentTimeMillis() + ".jpg";
}

在上面的示例中,我们在伴随对象中声明了常量值 FILE EXTENSION,并使用自定义 getter 将 FILENAME 变量初始化为 val。因为文件扩展名总是相同的,所以它被定义为一个 const 变量。但是,文件名将根据我们申请文件名的理由进行修改。在本例中,我们以当前时间命名文件。您不能一开始就给它一个值,因为该值是在运行时获得的。所以我们将在这里使用 val。

此处,变量 IMAGE_EXTENSION 已替换为其值“.png”,表明该值已内联,因此在运行时访问该变量没有开销。这是使用 const 而不是 val 的好处。

想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!