Kotlin 中的“const”和“val”有什么区别?
在 Kotlin 中,与在其他编程语言中一样,属性可以是可变的(可变的)或不可变的(不可改变的)。为了声明一个不可变的属性,我们使用了 const 和 val 这两个术语。开发人员经常对何时使用这些短语之一感到困惑。在本文中,我们将研究 Kotlin 中 const 和 val 之间的区别。
在 Kotlin 中使用“const”
const 关键字用于声明本质上不可变的属性,即只读属性。这些值仅在运行时已知,因此,在运行时不能将值分配给 const 变量。要成为 const 属性,属性必须满足以下要求:
- 必须是在顶层或对象或伴侣对象的成员。
- 应该从原始数据类型开始
- 没有自定义 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
}
}
GeekTip: In the above example, we declare the const value IMAGE_EXTENSION in the companion object and initialise the FILENAME variable as val using a custom getter.
因为文件扩展名总是相同的,所以它被定义为一个 const 变量。但是,文件名将根据我们申请文件名的理由进行修改。在本例中,我们以当前时间命名文件。您不能一开始就给它一个值,因为该值是在运行时获得的。所以我们将在这里使用 val。
科特林
public final String getIMAGENAME() {
return "Geeks" + System.currentTimeMillis() + ".jpg";
}
在上面的示例中,我们在伴随对象中声明了常量值 FILE EXTENSION,并使用自定义 getter 将 FILENAME 变量初始化为 val。因为文件扩展名总是相同的,所以它被定义为一个 const 变量。但是,文件名将根据我们申请文件名的理由进行修改。在本例中,我们以当前时间命名文件。您不能一开始就给它一个值,因为该值是在运行时获得的。所以我们将在这里使用 val。
此处,变量 IMAGE_EXTENSION 已替换为其值“.png”,表明该值已内联,因此在运行时访问该变量没有开销。这是使用 const 而不是 val 的好处。