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

时间:2019-08-05 08:57:47

标签: android kotlin

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

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

  1. 内部带有注解@file:JvmName和功能的文件
@file:JvmName("ClassX")

fun funX() {}

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

1 个答案:

答案 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代码。