LinkedIn问题
const val能做@JvmField
val不能做的事?
关于Val和const的区别有多种答案。canst Val和@JvmField
Val有什么区别?
我不确定是如何引起混淆的,但这两个概念并不是真正相关的。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
只能在顶级或object
s中使用,而@JvmField
可以用于任何属性。- 由于编译时内联,
const val
只能包含基本类型或String的值,并且初始化表达式必须足够简单,以便在编译时求值。
只是供参考,@JvmField
注释用于芬兰湾的科特林属性公开这些字段而不是通常的属性的getter/setter公约。
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
属性,这绝对不是一个常量。
这是带有选项的原始问题屏幕