与其他编程语言一样,在Kotlin中,属性可以是可变的(可以更改)或不可变的(不能更改)。我们使用关键字const并val声明一个不可变的属性。开发人员常常对这些术语感到困惑,例如何时使用哪个术语;
在Kotlin中使用“ const”
所述const关键字被用于声明那些不可变在本质即,这些属性是只读属性的属性。
但是,这些属性的值必须仅在编译时才知道,这const就是也称为编译时常量的原因。因此,在const变量中不允许在运行时分配值。
属性必须满足以下条件才能成为const属性:
必须是顶级对象,或者是对象的成员,或者是伴随对象的成员
必须使用String类型或原始类型进行初始化
没有自定义吸气剂
因此,您不能将const变量分配给函数或某些类,因为在这种情况下,变量将在运行时而不是在编译时进行初始化。
在KOTLIN中使用“ VAL”
该val关键字也用于只读属性。但是const和之间的主要区别在于val,val属性也可以在运行时进行初始化。
因此,您可以将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,两种情况都可以。
当我们可以使用“ VAL”时为什么要使用“ CONST”?
在前面的示例中,我们看到了val变量的值是在运行时和const编译时初始化的。那么,const如果可以使用,为什么要使用val呢?
让我们通过另一个真实的Android示例来了解constand的用例val:
TestClass{ companion object { const val FILE_EXTENSION = ".png" val FILENAME: String get() = "Img_" + System.currentTimeMillis() + FILE_EXTENSION }}
在上面的示例中,我们const在伴随对象中声明了名为FILE_EXTENSION的变量,并声明了该FILENAME变量,val并使用自定义getter对其进行了初始化。
由于文件的扩展名将始终相同,因此将其声明为const变量。但是,文件名将根据我们用于文件名的逻辑进行更改。在这里,在我们的示例中,我们基于当前时间来命名文件。您最初不能给它一些值,因为该值是在运行时获取的。因此,我们在val这里使用。
在代码编译之后发生的事情是,无论代码const中使用了什么变量,这些变量都会被该const变量的值替换,但是在的情况下val,这些变量将保持原样,因为我们不知道valat编译的值-时间。因此,如果您对上述代码进行反编译,那么您将看到(了解如何将Kotlin代码隐藏到Java中):
public final String getFileName() { return "Img_" + System.currentTimeMillis() + ".png"; }
在这里,您可以发现该变量FILE_EXTENSION已被其值替换,即“ .png”,即该值已被内联,因此在运行时访问该变量没有开销。这是使用constover的优势val。
这全都涉及Kotlin中const和val关键字之间的区别