gpt4 book ai didi

android - @文件 :JvmName vs @JvmStatic in companion object

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:22 24 4
gpt4 key购买 nike

我正在将部分应用程序从 Java 迁移到 Kotlin,对此有疑问。

什么是更好的或更好的方法?

  1. 包含注解@file:JvmName 和函数的文件
@file:JvmName("ClassX")

fun funX() {}

  1. 伴随对象内带有@JvmStatic 注释的典型类
class ClassX {
companion object {
@JvmStatic
fun funX() {}
}
}

最佳答案

让我们看看反编译后的代码来回答这个问题。

Kotlin 文件,带有像您一样的 @JvmName 注释:

@file:JvmName("ClassX")

fun funX() {}

将被编译成字节码,类似于这个 Java 代码:

@JvmName(
name = "ClassX"
)
public final class ClassX {
public static final void funX() {
}
}

与您在使用 Java 时可能会编写的内容非常相似,对吧?

一个 Kotlin 类,带有这样的伴随对象:

class ClassX {
companion object {
@JvmStatic
fun funX() {}
}
}

类似于此 Java 代码:

public final class ClassX {
public static final ClassX.Companion Companion = new ClassX.Companion((DefaultConstructorMarker)null);

@JvmStatic
public static final void funX() {
Companion.funX();
}

public static final class Companion {
@JvmStatic
public final void funX() {
}

private Companion() {
}

// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}

如您所见,带有伴随对象的类将生成更多代码。

这是好事还是坏事?你决定。我会说这很糟糕,最好使用带有 @JvmName 注释的文件。在 Kotlin 的论坛上也有关于此主题的讨论:read the best practices.

顺便说一句,您可以通过“工具”->“Kotlin”->“显示 Kotlin 字节码”在 IntelliJ IDEA 中查看字节码和反编译的 Java 代码。

关于android - @文件 :JvmName vs @JvmStatic in companion object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57355210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com