您将功能放置在 “伴侣对象” 中。
所以像这样的 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
批注或命名您的伴侣类。
从文档:
伴侣对象
类内的对象声明可以用伴随关键字标记:
class MyClass { companion object Factory { fun create(): MyClass = MyClass() } }
可以通过仅使用类名作为限定符来调用伴随对象的成员:
val instance = MyClass.create()
...
@JvmStatic
批注,则可以将伴随对象的成员生成为实际的静态方法和字段。有关更多详细信息,请参见 Java 互操作性部分。
添加@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 调用它,但可以从Foo.Blah.a()
类的 Java 中调用它(在 Kotlin 中也可以使用)。
Docs建议使用包级功能解决静态功能的大多数需求。它们只是在源代码文件中的类外部声明。可以使用 package 关键字在文件的开头指定文件的软件包。
宣言
package foo
fun bar() = {}
用法
import foo.bar
或者
import foo.*
现在,您可以使用以下命令调用该函数:
bar()
或者,如果您不使用 import 关键字:
foo.bar()
如果不指定软件包,则可以从根目录访问该功能。
如果您只有 Java 经验,这似乎有些奇怪。原因是 kotlin 不是严格的面向对象语言。您可以说它支持类之外的方法。
编辑:他们已编辑文档,不再包含有关推荐软件包级别功能的句子。 这是上面提到的原稿。
A. 旧的 Java 方式:
声明一个companion object
以包含一个静态方法 / 变量
class Foo{
companion object {
fun foo() = println("Foo")
val bar ="bar"
}
}
用 :
Foo.foo() // Outputs Foo
println(Foo.bar) // Outputs bar
B. 新科特林方式
直接声明文件,而不.kt
文件的类。
fun foo() = println("Foo")
val bar ="bar"
将methods/variables
与它们的名称一起使用。 (导入后)
用 :
foo() // Outputs Foo
println(bar) // Outputs bar