在 Kotlin 中,Java 静态方法的等效物是什么?伴随对象

2022-08-31 04:00:14

Kotlin 中没有关键字。static

在 Kotlin 中表示 Java 方法的最佳方法是什么?static


答案 1

将函数放在“伴随对象”中。

所以java代码是这样的:

class Foo {
  public static int a() { return 1; }
}

将成为

class Foo {
  companion object {
     fun a() : Int = 1
  }
}

然后,您可以从 Kotlin 代码中将其用作

Foo.a();

但是从Java代码中,您需要将其称为

Foo.Companion.a();

(这也适用于 Kotlin 内部。

如果您不喜欢必须指定位,则可以添加注释或命名伴随类。Companion@JvmStatic

文档中

伴随对象

类中的对象声明可以使用关键字进行标记:companion

class MyClass {
   companion object Factory {
       fun create(): MyClass = MyClass()
   }
}

可以通过简单地使用类名作为限定符来调用伴随对象的成员:

val instance = MyClass.create()

...

但是,在 JVM 上,如果使用注释,则可以将伴随对象的成员生成为真正的静态方法和字段。有关更多详细信息,请参阅 Java 互操作性部分。@JvmStatic

添加批注如下所示@JvmStatic

class Foo {
  companion object {
    @JvmStatic
    fun a() : Int = 1;
  }
}

然后它将作为一个真正的Java静态函数存在,可以从Java和Kotlin访问为.Foo.a()

如果它只是不喜欢这个名字,那么你也可以为伴随对象提供一个显式名称,如下所示:Companion

class Foo {
  companion object Blah {
    fun a() : Int = 1;
  }
}

这将允许您以相同的方式从Kotlin调用它,但是从java中调用它(这也可以在Kotlin中工作)。Foo.Blah.a()


答案 2

Docs 建议使用包级函数解决对静态函数的大多数需求。它们只是在源代码文件中的类外部声明。可以在文件开头使用 package 关键字指定文件的包。

声明

package foo

fun bar() = {}

用法

import foo.bar

或者

import foo.*

现在,您可以使用以下命令调用该函数:

bar()

或者,如果您不使用 import 关键字:

foo.bar()

如果未指定包,则可从根目录访问该函数。

如果你只有Java的经验,这可能看起来有点奇怪。原因是 kotlin 不是一种严格的面向对象语言。你可以说它支持类外的方法。

编辑:他们已经编辑了文档,不再包含有关推荐包级别函数的句子。这是上面提到的原始版本。


推荐