“ const”和“ val”有什么区别?

简介: “ const”和“ val”有什么区别?

与其他编程语言一样,在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,两种情况都可以。

     

    当我们可以使用“ 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中constval关键字之间的区别

        相关文章
        |
        3月前
        |
        JavaScript 前端开发
        var、let和const的作用及区别
        这篇文章详细解释了JavaScript中`var`、`let`和`const`三种变量声明方式的作用及它们在作用域、可变性、变量提升等方面的区别,并提供了示例代码来阐明各自的特性和适用场景。
        |
        6月前
        |
        人工智能 安全 机器人
        【C++】const_cast基本用法(详细讲解)
        【C++】const_cast基本用法(详细讲解)
        102 0
        |
        6月前
        |
        JavaScript 前端开发
        let,const,var区别
        let,const,var区别
        38 0
        const int*p 与 int const *p与 int * const p与const int * const p的区别(有明显对比,超级详细,超级好记)
        当只有一个const并且const在*左边时: (const int*p 与 int const *p,)*p的值不能改,但是p(地址)能改.我们可以看到第一,三张图片第五行*p下面有红线表示错误.而第二,四张没有红线的地方表示正确.所以我们可知道const int*p 与 int const *p是相同的只是书写方法不同.
        66 0
        C++ int const 和 const int 的区别
        C++ int const 和 const int 的区别
        167 0
        |
        JavaScript 前端开发
        var let const的区别
        `var`、`let`和`const`是用于声明变量的关键字,在 JavaScript 中具有不同的作用和用法。
        |
        编译器
        var、let、const之间有什么区别?(详细版)
        1.在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量
        |
        JavaScript 前端开发
        var、let、const的区别和推荐使用
        var、let、const的区别和推荐使用