Companion Objects

Kotlin不像Java或C#,类没有静态方法。在大多数情况下,使用包级别的函数就可以满足需求。

如果你需要写一个函数不需要使用类的实例就可以直接调用,但是需要访问类的内部(比如工厂方法),你可以写一个成员,将成员申明在那个类里面。

或者更特别的是,你可以定义一个companion对象在你的类里,你将可以访问它的成员就像Java/C#的语法一样。

使用companion关键字修饰类中的对象。

class MyClass {
    companion object Factory {
        fun create(): MyClass = MyClass()
    }
}

companion对象的调用使用类名作为修饰符

val instance = MyClass.create()

companion对象可以省略,这种情况下Companion作为名字被使用

class MyClass {
    companion object {
        val instance1 = MyClass()
        val instance2 = MyClass()
    }
}
val v = MyClass.Companion;
v.instance1
v.instance2

尽管companion对象很像其他语言的静态成员变量,在运行时这些是真实实例,并且可以实现接口。

interface Factory<T> {
    fun create(): T
}
class MyClass {
    companion object : Factory<MyClass> {
        override fun create(): MyClass = MyClass()
    }
}

无论如何,在JVM中可以使用companion生成类似静态的方法和属性就好像你使用了@JvmStatic注解

results matching ""

    No results matching ""