Kotlin 科特林-什么';“这是为什么?”;常数;
已经澄清了Kotlin 科特林-什么';“这是为什么?”;常数;,kotlin,constants,Kotlin,Constants,已经澄清了val和const val之间的区别 但我的问题是,为什么我们应该使用const关键字?与生成的Java代码透视图没有区别 此Kotlin代码: class Application private val testVal = "example" private const val testConst = "another example" 生成: public final class ApplicationKt { private static final String
val
和const val
之间的区别
但我的问题是,为什么我们应该使用const
关键字?与生成的Java代码透视图没有区别
此Kotlin代码:
class Application
private val testVal = "example"
private const val testConst = "another example"
生成:
public final class ApplicationKt
{
private static final String testVal = "example";
private static final String testConst = "another example";
}
在我看来,主要的区别在于
val
意味着不会为属性生成setter(但会生成getter),而且值不是常量,而const val
是常量(就像Java的私有/公共静态final xxx
)
例如:
class Foo {
private val testVal: String
get() = Random().nextInt().toString()
}
生成的代码并不总是相同的
如果
testVal
和testConst
是public
,则生成的代码将不同testVal
将是private
和public
get
,而testConst
将是public
,没有任何getter。因此const
避免生成getter。正如文档中直接提到的,testConst
可以在注释参数中使用,但是testVal
不能
更一般地说,const
保证您拥有Java意义上的常量变量,并且
使用它们也有不同之处 常数示例(Kotlin): 如何使用(Java):
您看不到生成的代码之间的差异,因为您的变量是
private
。否则,对于testVal
,结果将具有getter
:
public final class ApplicationKt {
@NotNull
private static final String testVal = "example";
@NotNull
public static final String testConst = "another example";
@NotNull
public static final String getTestVal() {
return testVal;
}
}
因此,在您的特定情况下,它是相同的,只是您可以在注释中使用常量
属性:
const val testVal: String = "This subsystem is deprecated"
@Deprecated(testVal) fun foo() { ... }
“const”是编译时常量,而“val”用于在运行时定义常量。
这意味着“const”永远不能分配给函数或任何类构造函数,只能分配给字符串或原语
例如:
const val NAME = "M Sakamoto"
val PICon = getPI()
fun getPI(): Double {
return 3.14
}
fun main(args: Array<String>) {
println("Name : $NAME")
println("Value of PI : $PICon")
}
显式比隐式好。如果在初始化后尝试为常量赋值,编译器可能会发现这是一个可能的错误。通过定义一个常量,您告诉编译器(以及开发人员,包括您自己)这个值不是要更改的。@JamesB如果您尝试将一个值赋给非常量
,您认为会发生什么?我很惊讶没有人提到这一点。另一个很大的区别是编译器将内联一个常量。尝试在Kotlin代码中引用testVal和testConst,看看我的意思。这是真的——对于公共字段,我们将使用getter。但是这意味着对于private const val
我们应该被告知const
是一个冗余修饰符。这是真的-对于private字段没有区别。但这意味着对于private const val,应该通知我们const是一个冗余修饰符。
const val testVal: String = "This subsystem is deprecated"
@Deprecated(testVal) fun foo() { ... }
const val NAME = "M Sakamoto"
val PICon = getPI()
fun getPI(): Double {
return 3.14
}
fun main(args: Array<String>) {
println("Name : $NAME")
println("Value of PI : $PICon")
}
Name : M Sakamoto
Value of PI : 3.14