Kotlin的伴生对象(companion object)在语法上类似于Java中的静态方法,所以很多人也都是这样用的。本文将向你展示伴生对象的工作方式和在Kotlin中创建静态方法的推荐做法。
是一个在类内部声明的用 companion 关键字标记的对象。在语法上它类似于Java中的静态方法:你可以通过类名调用对象内的成员。
代码一般是这样的:
- // 声明
- class KCompanion {
- companion object{
- fun getBongs(nTimes: Int) {
- for (i in 1 .. nTimes) {
- print("BONG ")
- }
- }
- }
- }
- // 调用
- KCompanion.getBongs()
相当简单对吧!即使伴生对象的成员在其他语言中看起来像是静态成员,在运行时他们仍然是真实对象的成员实例。
我们看看代码编译后发生了什么:
- public final class KCompanion {
- ...
- public static final class Companion {
- public final void getBongs(int nTimes) {
- ...
- }
- }
- }
一个额外的Companion类 被创建出来了。如何避免创建这个类呢?我们可以使用包可见级别的函数来实现我们的需求。
创建一个kotlin文件 Bong.kt,然后写我们想要作为静态的在项目各处都可访问的方法:
- fun getBongs(nTimes: Int) {
- for (i in 1 .. nTimes) {
- print("BONG ")
- }
- }
- fun someOtherMethod() {
- print("BONG ")
-
- }
这样就可以直接访问包可见函数,不需要使用任何限定符:
- // 调用全局函数
- getBongs(5)
我们看看这段代码编译后的代码是什么样的:
- public final class BongKt {
- public static final void getBongs(int nTimes) {
- ...
- }
- public static final void someOtherMethod() {
- ...
- }
- }
可以看到,编译后的代码没有创建额外的类。
总结:如果可以的话,当你想使用伴生对象 companion object 时,考虑使用包函数替代~