静态方法

Kotlin 中,我们还可以将命名对象或伴生对象中定义的函数标注为 @JvmStatic,这样编译器既会在相应对象的类中生成静态方法,也会在对象自身中生成实例方法。

跟静态属性类似的,我们看下面的代码示例:

  1. class Department {
  2. ...
  3. companion object {
  4. var innerID = "X001"
  5. @JvmField
  6. var innerName = "DEP"
  7. fun getObjectName() = "ONAME"
  8. @JvmStatic
  9. fun getObjectID() = "OID"
  10. }
  11. }

编译器编译之后,反编译成的对应的Java代码:

  1. public final class Department {
  2. ...
  3. @JvmStatic
  4. @NotNull
  5. public static final String getObjectID() {
  6. return Companion.getObjectID();
  7. }
  8. public static final class Companion {
  9. ...
  10. @NotNull
  11. public final String getObjectName() {
  12. return "ONAME";
  13. }
  14. @JvmStatic
  15. @NotNull
  16. public final String getObjectID() {
  17. return "OID";
  18. }
  19. ...
  20. }
  21. }

在Java中调用的代码如下:

  1. Department.Companion.getObjectID(); // OK
  2. Department.Companion.getObjectName(); // OK, 唯一的工作方式
  3. Department.getObjectID(); // ALSO OK
  4. Department.getObjectName(); // ERROR

这些注解语法是编译器为了更加方便Java调用Kotlin代码提供的一些简便技巧。这样可使得Java中调用Kotlin代码更加自然优雅些。