kotlin 舍弃了 static 关键字,而 static 关键字在 Java 中却是使用广泛的,在 kotlin 中怎么实现静态方法呢?
我们可以使用 companion object 的方式来实现,
class Foo {
companion object {
fun a() : Int = 1
}
}
在 kotlin 中
Foo.a()
在 Java 中:
Foo.Companion.a();
如果感觉在 Java 中用 Foo.Companion.a() 很麻烦,希望看上去更加像调用静态方法,那么可以加上 @JvmStatic 注解。代码如下:
class Foo {
companion object {
@JvmStatic
fun a() : Int = 1
}
}
什么是 companion object 呢,可以理解 companion object 是一个类的伴生对象,一个和类一起生存的对象,只要类存在,那么就存在这么一个对象,主要类被类加载器加载,虚拟机就会创建他的伴生对象。没有具体名字的伴生对象就叫 Companion(注意大写),有名字的伴生对象比如这样:
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
Factory 是 MyClass 的伴生对象,在使用的时候这样调用:
MyClass.Factory.create()
顶层函数,package-level functions, top-level functions 。
声明:
package foo
fun bar() = {}
调用:
import foo.bar
或者:
import foo.*
import 之后,你就可以直接使用 bar() 方法了。
或者你不使用 import ,也可以带包名调用:
foo.bar()
习惯用 Java 的人有会点不习惯,看上去这个方法在类的外面,有人认为 kotlin 不是严格的面向对象语言。但其实包级函数也是被编译到一个类中的,比如上面的例子,编译器会创建一个 FooPacakge 的类来包含所有的包级函数和包级属性。
在早期的 kotlin 官方文档中推荐使用这种方式来替换静态方法,但是在后续版本的文档中删除了。
In Kotlin, unlike Java or C#, classes do not have static methods. In most cases, it's recommended to simply use package-level functions instead.
- EOF -
本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。
转载请注明:文章转载自 Binkery 技术博客 [https://binkery.com]
本文标题: 在 Kotlin 中如何书写静态方法
本文地址: https://binkery.com/archives/2020.09.24-static-method-in-kotlin.html