LinkedIn问题
const val可以做哪些@JvmField val不能做的事情?
关于Val和const之间的区别,有多种答案。canst Val和@JvmField Val有什么区别?
发布于 2021-10-09 22:47:58
我不确定混淆是如何产生的,但这两个概念并不是真正相关的。const val用于声明编译时常量,而@JvmField用于将属性公开为字段,而不是通过getter/setter。
const val可以做哪些@JvmField val不能做的事情?
1- const val使编译器在所有使用位置内联常量的值。常量的用法在字节码中甚至是不可见的,只有常量的值存在。
这有一个重要的后果:如果模块A使用在模块B中声明的const val,并且该常量的值后来在模块B中被更改,那么模块A需要针对模块B的新版本进行重新编译才能看到更改。否则,即使新模块B在类路径上,A仍将使用旧的常量值。
2- const val是一个与平台无关的概念,它可以在JS或原生平台上使用,而不仅仅是在JVM上。@JvmField是一个JVM概念。
其他值得注意的区别:
const val只能在顶级或object中使用,而@JvmField可以在编译时内联的任何property.const val只能包含基元类型或字符串的值,并且初始值设定项表达式必须足够简单,以便在编译时计算。仅供参考,在Kotlin属性上使用@JvmField注释以将它们公开为字段,而不是通常的获取/设置属性约定。
下面是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-annotated属性的值。该属性甚至不必是val -您可以有一个@JvmField-annotated var属性,它绝对不是一个常量。
https://stackoverflow.com/questions/69510793
复制相似问题