@file:JvmName vs @JvmStatic 在伴随对象中

Esp*_*nz0 5 android kotlin

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

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

  1. 带有注释 @file:JvmName 和函数的文件
@file:JvmName("ClassX")

fun funX() {}
Run Code Online (Sandbox Code Playgroud)

或者

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

mad*_*ead 6

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

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

@file:JvmName("ClassX")

fun funX() {}
Run Code Online (Sandbox Code Playgroud)

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

@file:JvmName("ClassX")

fun funX() {}
Run Code Online (Sandbox Code Playgroud)

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

一个 Kotlin 类,有一个像这样的伴生对象:

class ClassX {
    companion object {
        @JvmStatic
        fun funX() {}
    }
}
Run Code Online (Sandbox Code Playgroud)

类似于此 Java 代码:

@JvmName(
   name = "ClassX"
)
public final class ClassX {
   public static final void funX() {
   }
}
Run Code Online (Sandbox Code Playgroud)

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

是好还是坏?你决定。我会说这很糟糕,最好使用带@JvmName注释的文件。Kotlin 的论坛上也有关于这个话题的讨论:阅读最佳实践。

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