我正在将部分应用程序从Java迁移到Kotlin,对此有疑问。
什么是更好或更好的方法?
@file:JvmName("ClassX")
fun funX() {}
或
class ClassX {
companion object {
@JvmStatic
fun funX() {}
}
}
答案 0 :(得分:4)
让我们看一下反编译的代码来回答这个问题。
带有@JvmName
注释的Kotlin文件,例如您的
@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.
顺便说一句,您可以通过“工具”->“科特林”->“显示科特林字节码”在IntelliJ IDEA中查看字节码和反编译的Java代码。