在 Kotlin 中如何书写静态方法

  • kotlin,Java,static,静态方法
  • 2020.09.24

kotlin 舍弃了 static 关键字,而 static 关键字在 Java 中却是使用广泛的,在 kotlin 中怎么实现静态方法呢?

companion object

我们可以使用 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