如何创建Kotlin静态函数(附实例)

346 阅读2分钟

与Java编程语言不同,Kotlin没有一个static 修改器,你可以用它来定义class 的静态函数(方法)。

Kotlin不使用static 修饰符,而是允许你在一个类里面创建一个companion object 来声明静态函数。

下面的Java代码:

class Main {
public static String hello() {
return "Hello World";
}
}
System.out.println(Main.hello()); // Hello World

等同于下面的Kotlin代码:

class Main {
companion object {
fun hello(): String {
return "Hello World"
}
}
}
println(Main.hello()) // Hello World

在这两种语言中,函数hello() ,可以用Main.hello() ,而不需要创建一个新的class 的实例。

在引擎盖下,Kotlin的companion objectMain 类内创建了一个Companion 类,所以如果你需要从Java中调用Kotlin静态代码,你需要像这样从Companion 类中调用它。

Main.Companion.hello();

如果你不想要额外的Companion 调用,你可以在写静态函数之前添加@JvmStatic 注解,像这样:

class Main {
companion object {
 @JvmStatic
 fun hello(): String {
return "Hello World"
}
}
}

该注解将导致Kotlin代码在编译为Java字节码时生成一个额外的static 方法。

在下面的代码中,只有当你添加@JvmStatic 注释时,才会生成高亮的行:

public static final class Main {
@NotNull
public static final Scratch.Main.Companion Companion =
new Scratch.Main.Companion((DefaultConstructorMarker) null);
 @JvmStatic
 @NotNull
 public static final String hello() {
 return Companion.hello();
 }

public static final class Companion {
@JvmStatic
@NotNull
public final String hello() {
return "Hello World";
}
private Companion() {
}
// $FF: synthetic method
 public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}

有了@JvmStatic 注解,你可以用同样的语法从Java中调用该方法。

Main.hello();

但只有当你从Java中调用已编译的Kotlin代码时才需要这样做。

在Kotlin对象中的Kotlin静态函数

除了在Kotlinclass 中创建一个companion object ,你还可以创建一个Kotlinobject 来保存你的静态函数。

Kotlinobject 是一个静态实例,不能像class 那样被实例化,所以它很适合存储你的静态变量和函数。

下面是Kotlin对象中的同一个静态hello() 函数:

object Main {
fun hello(): String {
return "Hello World"
}
}
println(Main.hello()) // Hello World

你可以自由地使用classobject 来定义你在Kotlin的静态函数。