我最近读了关于const关键字的文章,我很困惑!我找不到const和val关键字之间的任何区别,我的意思是我们可以用它们来创建一个不可变变量,还有什么我遗漏的吗?
当前回答
val和const都是不可变的。
Const用于声明编译时常量,而val用于声明运行时常量。
const val VENDOR_NAME = "Kifayat Pashteen" // Assignment done at compile-time
val PICon = getIP() // Assignment done at run-time
其他回答
对于那些在val和const中寻找哪个更合适或更有效的人:
对于String或任何基本数据类型,建议使用const val而不是val。因为val在运行时是已知的,所以当你的应用程序运行时,它会处理所有的值。另一方面,const val将在编译时提前执行此操作。所以const val会给出更好的结果。
val和const都是不可变的。
Const用于声明编译时常量,而val用于声明运行时常量。
const val VENDOR_NAME = "Kifayat Pashteen" // Assignment done at compile-time
val PICon = getIP() // Assignment done at run-time
您可以将Kotlin转换为Java。 然后你可以看到const比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;
}
}
让我们通过一个例子来学习。
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修饰符标记为编译时常量。这些属性需要满足以下要求: 对象声明或伴生对象的顶级或成员。 初始化为String类型或基本类型的值 没有自定义getter 这些属性可以在注释中使用。
来源:官方文件
推荐文章
- Kotlin中惯用的登录方式
- 如何在Kotlin中实现生成器模式?
- Kotlin中的单个感叹号
- 为什么不是字符串。空一个常数?
- 如何允许所有网络连接类型HTTP和HTTPS在Android(9)馅饼?
- 如何克隆或复制一个列表在kotlin
- 如何将字符串转换为长在Kotlin?
- 如何在Kotlin解析JSON ?
- 什么Java 8流。收集等价物可在标准Kotlin库?
- Android房间-简单的选择查询-不能访问数据库在主线程
- 如何检查“instanceof”类在kotlin?
- “by”关键字在Kotlin中做什么?
- 导航目标xxx对于这个NavController是未知的
- 我如何解决错误“minCompileSdk(31)指定在一个依赖的AAR元数据”在本机Java或Kotlin?
- 模块是用不兼容的Kotlin版本编译的。其元数据的二进制版本为1.5.1,预期版本为1.1.15