首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >const val可以做哪些@JvmField val不能做的事情?

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

Stack Overflow用户
提问于 2021-10-09 21:51:15
回答 1查看 189关注 0票数 0

LinkedIn问题

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

关于Val和const之间的区别,有多种答案。canst Val和@JvmField Val有什么区别?

EN

Stack Overflow用户

发布于 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.
  • because上使用,const val只能包含基元类型或字符串的值,并且初始值设定项表达式必须足够简单,以便在编译时计算。

仅供参考,在Kotlin属性上使用@JvmField注释以将它们公开为字段,而不是通常的获取/设置属性约定。

下面是Kotlin代码:

代码语言:javascript
运行
复制
class A {
    val prop: Int = 42
}

被编译成与以下Java代码等效的字节码:

代码语言:javascript
运行
复制
public final class A {
    private final int prop = 42;

    public int getProp() {
        return this.prop;
    }
}

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

代码语言:javascript
运行
复制
public final class A {
    public final int prop = 42;
}

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

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69510793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档