与其他编程语言一样,在Kotlin中,属性可以是可变的(可以更改)或不可变的(不能更改)。我们使用关键字constval声明一个不可变的属性。开发人员常常对这些术语感到困惑,例如何时使用哪个术语。

在Kotlin中使用“ const”

所述const关键字被用于声明那些不可变在本质即,这些属性是只读属性的属性。

但是,这些属性的值必须仅在编译时已知,这const就是也称为编译时常量的原因。因此,const变量中不允许在运行时分配值。

属性必须满足以下条件才能成为const属性:

  • 必须是顶级对象,或者是对象的成员,或者是伴随对象的成员
  • 必须使用String类型或原始类型进行初始化
  • 没有自定义获取器

因此,您不能将const变量分配给函数或某些类,因为在这种情况下,变量将在运行时而不是在编译时进行初始化。

在Kotlin中使用“ val”

val关键字还用于只读属性。但是const和之间的主要区别在于valval属性也可以在运行时进行初始化。

因此,您可以将val变量分配给函数或某些类。

const val companyName = "MindOrks" // this will work
val comapanyname = "MindOrks" // this will work

const val companyName = getCompanyName() // will not work
val companyName = getCompanyName() // this will work

在上面的示例中,我们将其companyName用作不可变变量。使用时const,如果直接分配该值就可以了,但是如果尝试从某个函数分配该值getCompanyName,则将收到错误消息,因为此处将在运行时而不是在编译时分配该值。但是在情况下val,两种情况都可以。

让我们再来看一个真实的Android示例,以了解constand 的用例val

YourClassName {
    companion object {    
        const val FILE_EXTENSION = ".png"    
        val FILENAME: String
        get() = "Img_" + System.currentTimeMillis() + FILE_EXTENSION 
    }
}

在上面的示例中,我们const在伴随对象中声明了名为FILE_EXTENSION 的变量,并声明了FILENAME变量as val并使用自定义getter对其进行了初始化。

由于文件的扩展名将始终相同,因此将其声明为const变量。但是,文件名将根据我们用于文件名的逻辑进行更改。在这里,在我们的示例中,我们基于当前时间命名文件。您最初不能给它一些值,因为该值是在运行时获取的。因此,我们在val这里使用。

代码编译后发生的事情是,无论代码const中使用了什么变量,这些变量都会被该const变量的值替换,但是在的情况下val,这些变量将保持原样,因为我们不知道valat编译的值-时间。因此,如果您对上述代码进行反编译,那么您将看到(了解如何将Kotlin代码隐藏到Java中):

public final String getFILENAME() {
   return "Img_" + System.currentTimeMillis() + ".png";
}

在这里,您会发现该变量FILE_EXTENSION已被其值(即“ .png ”)替换。

这全都涉及Kotlin中constval关键字之间的区别。

分类: 未分类

bayshier

愿世间每个美好的灵魂都能被温柔以待

发表评论

电子邮件地址不会被公开。 必填项已用*标注