【发布时间】:2016-10-02 10:21:21
【问题描述】:
我最近读到了const 关键字,我很困惑!我找不到const 和val 关键字之间的任何区别,我的意思是我们可以使用它们来制作一个不可变的变量,还有什么我遗漏的吗?
【问题讨论】:
我最近读到了const 关键字,我很困惑!我找不到const 和val 关键字之间的任何区别,我的意思是我们可以使用它们来制作一个不可变的变量,还有什么我遗漏的吗?
【问题讨论】:
consts 是编译时常量。这意味着它们的值必须在编译时分配,不像vals,它可以在运行时完成。
这意味着,consts 永远不能分配给函数或任何类构造函数,而只能分配给 String 或原语。
例如:
const val foo = complexFunctionCall() //Not okay
val fooVal = complexFunctionCall() //Okay
const val bar = "Hello world" //Also okay
【讨论】:
const val foo = "Hello world" 和 val bar = "Hello world"?它们是一样的吗?
const 值将在编译期间完全内联。
const val 而不仅仅是 const?在我看来,val 关键字在这种情况下完全是多余的,因为const var 表面上看起来很荒谬。
const val,const 是val 的修饰符,而不是关键字。修饰符>关键字。更多相同设计的示例是annotation/enum/data class、private val、inline fun 等。
只是为了补充卢卡的答案:
编译时常量
可以使用 const 修饰符将其值在编译时已知的属性标记为编译时常量。此类属性需要满足以下要求:
- object declaration 或companion object 的顶级成员或成员。
- 使用 String 类型或原始类型的值初始化
- 没有自定义 getter
这样的属性可以用在注解中。
【讨论】:
您可以将 Kotlin 转换为 Java。 然后你可以看到 const 比 val 多了一个 static 修饰符。 像这样的简单代码。
科特林:
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;
}
}
【讨论】:
const 被删除,会产生不同的Java 文件吗?
SimplePerson 的 private final String name; 进行比较,后者没有 const 并且也是私有的,但那是因为它是成员 val 而不是顶级/包val 而不是因为const。
const kotlin 到 Java
const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";
val kotlin 到 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。
另外 -
【讨论】:
val 和 const 都是不可变的。
const 用于声明编译时常量,而val 用于声明运行时常量。
const val VENDOR_NAME = "Kifayat Pashteen" // Assignment done at compile-time
val PICon = getIP() // Assignment done at run-time
【讨论】:
Kotlin val 关键字用于 只读 属性,与 Kotlin var 关键字相比。 read-only 属性的另一个名称是 immutable。
Kotlin 代码:
val variation: Long = 100L
Java 等效项如下所示:
final Long variation = 100L;
我们也将const 关键字用于不可变属性。 const 用于编译时已知的属性。这就是区别。考虑到const 属性必须声明为globally。
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);
}
}
【讨论】:
对于那些正在寻找val 和const 之间更合适或更高效的人:
如果我们要创建字符串或任何原始数据类型,那么我们必须使用const val 而不是val。因为val 在运行时是已知的,所以当你的应用程序运行时,它会处理所有的值。另一方面,const val 将在编译时更早地执行此操作。所以性能方面const val 会给出更好的结果。
【讨论】:
因为我看了很多,那个“val”的意思是不可变的:肯定不是这样的,看这个例子:
class Test {
var x: Int = 2
val y
get() = x
}
fun main(args: Array<String>) {
val test = Test()
println("test.y = ${test.y}") // prints 2
test.x = 4
println("test.y = ${test.y}") // prints 4
}
遗憾的是,您目前只能期望 const 具有真正的不变性 - 但这仅在编译时。在运行时,您无法创建真正的不变性。
val 仅表示“只读”,您不能直接更改此变量,只能像我在上面的示例中显示的那样间接更改。
【讨论】: