我最近读了关于const关键字的文章,我很困惑!我找不到const和val关键字之间的任何区别,我的意思是我们可以用它们来创建一个不可变变量,还有什么我遗漏的吗?
当前回答
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 这些属性可以在注释中使用。
来源:官方文件
const kotlin到Java
const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";
val kotlin to Java
val Car_1 = "BUGATTI" // final String Car_1 = "BUGATTI";
简单地说
const变量的值在编译时已知。 val的值用于在运行时定义常量。
示例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。
此外,
Val是只读的意味着在运行时是不可变的 Var是在运行时已知的可变变量 Const是不可变的,并且是编译时已知的变量
让我们通过一个例子来学习。
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会给出更好的结果。
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);
}
}
推荐文章
- Ruby on Rails:哪里定义全局常量?
- Swift 'if let'语句等价于Kotlin
- 在c++中,是通过值传递更好,还是通过引用到const传递更好?
- Java的String[]在Kotlin中等价于什么?
- 错误:执行失败的任务':app:compileDebugKotlin'。>编译错误。详细信息请参见日志
- Kotlin's List missing“add”,“remove”,Map missing“put”,等等?
- 声明一个常量数组
- 为什么非const引用不能绑定到临时对象?
- 静态const vs #define
- 常量指针和指向常量的指针
- char*和const char*的区别?
- 如何在Kotlin延迟后调用函数?
- 如何使“不适当的阻塞方法调用”适当?
- Kotlin中的' forEach '中的' break '和' continue '
- Kotlin协程中的启动/连接和异步/等待之间有什么区别