我最近读过const
关键字,我很困惑!我找不到它和val
关键字之间的任何区别,我的意思是我们可以使用它们来创建一个不可变的变量,还有什么我不知道的吗?
答案 0 :(得分:265)
const
是编译时常量。这意味着它们的值必须在编译期间分配,与val
不同,它可以在运行时完成。
这意味着,永远不能将const
分配给函数或任何类构造函数,而只能分配给String
或原语。
例如:
const val foo = complexFunctionCall() //Not okay
val fooVal = complexFunctionCall() //Okay
const val bar = "Hello world" //Also okay
答案 1 :(得分:25)
只是添加到Luka的回答中:
编译时间常数
在编译时已知的值的属性可以使用const修饰符标记为编译时常量。这些属性需要满足以下要求:
- object declaration或companion object的顶级或成员。
- 使用String类型或基本类型
初始化- 没有自定义getter
此类属性可用于注释。
答案 2 :(得分:10)
将kotlin转换为Java
const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";
瓦尔科特林到Java
val Car_1 = "BUGATTI" // final String Car_1 = "BUGATTI";
以简单语言
示例1-
const val Car_1 = "BUGATTI" ✔
val Car_2 = getCar() ✔
const val Car_3 = getCar() ❌
//Because the function will not get executed at the compile time so it will through error
fun getCar(): String {
return "BUGATTI"
}
这是因为getCar()在运行时求值,并将该值分配给Car。
此外-
答案 3 :(得分:9)
您可以将Kotlin转换为Java。 然后,您会看到 const 的 static 修饰符比 val 多。 像这样的简单代码。
科特琳:
const val str = "hello"
class SimplePerson(val name: String, var age: Int)
到Java(部分):
@NotNull
public static final String str = "hello";
public final class SimplePerson {
@NotNull
private final String name;
private int age;
@NotNull
public final String getName() {
return this.name;
}
public final int getAge() {
return this.age;
}
public final void setAge(int var1) {
this.age = var1;
}
public SimplePerson(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.age = age;
}
}
答案 4 :(得分:7)
在kotlin中,const
和val
既代表不变性,又代表只读值,并在Java中充当final
关键字。
val
关键字必须用于声明运行时值,而const
关键字必须用于声明编译时值。
请记住,const必须仅用于原始数据类型,而不能用于函数和构造函数。
Example -
const val fun1 = anyFunctionOrConstructor() // it is not fine
val fun2 = anyFunctionOrConstructor() // it is perfectly fine
const val aa = "My String" // it is perfectly fine
答案 5 :(得分:6)
val
和const
都是不可变的。
const
用于声明编译时常量,而val
用于声明运行时常量。
const val VENDOR_NAME = "Kifayat Pashteen" // Assignment done at compile-time
val PICon = getIP() // Assignment done at run-time
答案 6 :(得分:1)
val
关键字相比, Kotlin var
关键字具有只读属性。 read-only
属性的另一个名称是immutable
。
科特琳代码:
val variation: Long = 100L
等效的Java看起来像这样:
final Long variation = 100L;
我们也将const
关键字用于不可变属性。 const
用于编译时已知的属性。就是这样。请考虑必须将const
属性声明为 globally
。
科特琳码(在操场上):
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);
}
}
答案 7 :(得分:1)
对于那些正在寻找 val
和 const
之间更合适或更高效的人:
如果我们要创建 String 或任何原始数据类型,那么我们必须使用 const val
而不是 val
。因为 val
在运行时是已知的,所以当您的应用程序运行时,它将处理所有值。另一方面,const val
将在编译时更早地执行此操作。因此,性能明智的 const val
应该会给出更好的结果。