我最近读了关于const关键字的文章,我很困惑!我找不到const和val关键字之间的任何区别,我的意思是我们可以用它们来创建一个不可变变量,还有什么我遗漏的吗?


当前回答

让我们通过一个例子来学习。

object Constants {

    val NAME = "Amit"

}

注意:我们没有使用const。

并且,我们正在访问这个NAME,如下所示:

fun testValWithoutConst() {
    val name = Constants.NAME
}

现在,我们需要反编译这段代码。为此,我们必须将这个Kotlin源文件转换为Java源文件。

我们将得到以下输出:

public final void testValWithoutConst() {
  String name = Constants.INSTANCE.getNAME();
}

输出与预期一致。

上面的例子没有使用const关键字。现在,我们使用const关键字。

为此,我们将修改Kotlin中的对象类Constants:

object Constants {

    const val NAME = "Amit"

}

注意:我们使用的是const。

并且,我们正在访问这个NAME,如下所示:

fun testValWithConst() {
    val name = Constants.NAME
}

现在,当我们反编译这段代码时,我们将得到以下输出:

public final void testValWithConst() {
  String name = "Amit";
}

在这里,我们可以看到变量NAME已经被它的值Amit所取代。

由于值已内联,因此在运行时访问该变量不会产生任何开销。因此,它将导致应用程序的更好性能。

这就是在Kotlin中使用const的优势。

引用自我的博客:在Kotlin中使用const的优势

其他回答

const是编译时常量。这意味着它们的值必须在编译时赋值,而不像val那样可以在运行时赋值。

这意味着,const永远不能被赋值给函数或任何类构造函数,而只能赋值给String或原语。

例如:

const val foo = complexFunctionCall()   //Not okay
val fooVal = complexFunctionCall()  //Okay

const val bar = "Hello world"           //Also okay

val

与Kotlin var关键字相比,Kotlin val关键字用于只读属性。只读属性的另一个名称是不可变的。

芬兰湾的科特林代码:

val variation: Long = 100L

Java的等效代码如下所示:

final Long variation = 100L;

康斯特瀑布

我们也对不可变属性使用const关键字。Const用于编译时已知的属性。这就是区别。考虑到const属性必须全局声明。

Kotlin代码(游乐场):

const val WEBSITE_NAME: String = "Google"

fun main() {    
    println(WEBSITE_NAME)
}

Java代码(在操场):

class Playground {

    final static String WEBSITE_NAME = "Google";

    public static void main(String[ ] args) {
        System.out.println(WEBSITE_NAME);
    }
}

再补充一下卢卡的回答:

编译时常量 在编译时已知值的属性可以使用const修饰符标记为编译时常量。这些属性需要满足以下要求: 对象声明或伴生对象的顶级或成员。 初始化为String类型或基本类型的值 没有自定义getter 这些属性可以在注释中使用。

来源:官方文件

让我们通过一个例子来学习。

object Constants {

    val NAME = "Amit"

}

注意:我们没有使用const。

并且,我们正在访问这个NAME,如下所示:

fun testValWithoutConst() {
    val name = Constants.NAME
}

现在,我们需要反编译这段代码。为此,我们必须将这个Kotlin源文件转换为Java源文件。

我们将得到以下输出:

public final void testValWithoutConst() {
  String name = Constants.INSTANCE.getNAME();
}

输出与预期一致。

上面的例子没有使用const关键字。现在,我们使用const关键字。

为此,我们将修改Kotlin中的对象类Constants:

object Constants {

    const val NAME = "Amit"

}

注意:我们使用的是const。

并且,我们正在访问这个NAME,如下所示:

fun testValWithConst() {
    val name = Constants.NAME
}

现在,当我们反编译这段代码时,我们将得到以下输出:

public final void testValWithConst() {
  String name = "Amit";
}

在这里,我们可以看到变量NAME已经被它的值Amit所取代。

由于值已内联,因此在运行时访问该变量不会产生任何开销。因此,它将导致应用程序的更好性能。

这就是在Kotlin中使用const的优势。

引用自我的博客:在Kotlin中使用const的优势

对于那些在val和const中寻找哪个更合适或更有效的人:

对于String或任何基本数据类型,建议使用const val而不是val。因为val在运行时是已知的,所以当你的应用程序运行时,它会处理所有的值。另一方面,const val将在编译时提前执行此操作。所以const val会给出更好的结果。