const val能做什么@JvmField val不能做?



LinkedIn问题

const val能做@JvmFieldval不能做的事?

关于Val和const的区别有多种答案。canst Val和@JvmFieldVal有什么区别?

我不确定是如何引起混淆的,但这两个概念并不是真正相关的。const val是关于声明编译时常量,而@JvmField是关于暴露属性作为一个字段,而不是通过getter/setter。

const val可以做@JvmField val不能做的事情?

1 -const val使编译器在所有使用位置内联常量的值。该常量的用法在字节码中甚至不可见,只有常量的值存在。

这有一个重要的结果:如果模块A使用了模块B中声明的const val,并且后来在模块B中更改了该常量的值,那么模块A需要根据模块B的新版本重新编译以查看更改。否则,即使新模块B位于类路径上,A仍将使用旧的常数值。

2 -const val是一个与平台无关的概念,它不仅可以在JVM上使用,还可以在JS或Native平台上使用。@JvmField是JVM的一个概念。

其他不同之处:

  • const val只能在顶级或objects中使用,而@JvmField可以用于任何属性。
  • 由于编译时内联,const val只能包含基本类型或String的值,并且初始化表达式必须足够简单,以便在编译时求值。

只是供参考,@JvmField注释用于芬兰湾的科特林属性公开这些字段而不是通常的属性的getter/setter公约。

以下Kotlin代码:
class A {
val prop: Int = 42
}

被编译成字节码,相当于下面的Java代码:

public final class A {
private final int prop = 42;
public int getProp() {
return this.prop;
}
}

当使用@JvmField注释时,字段将直接公开而不需要getter:

public final class A {
public final int prop = 42;
}

const val不同,编译器不会内联@JvmField注释属性的值。该属性甚至不必是val-你可以有一个@JvmField注释的var属性,这绝对不是一个常量。

这是带有选项的原始问题屏幕

最新更新