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