16. 对象声明与伴生对象

对象声明

单例模式在一些场景中很有用,而Kotlin使单例声明变得很容易。

object DataProviderManager {
    fun registerDataProvider(provider: DataProvider) {
        // ……
    }
    val allDataProviders: Collection
        get() = // ……
}

这称为对象声明。并且它总是在object关键字后跟一个名称。就像声明变量一样,对象声明不是一个表达式,不能用在赋值语句的右边。

对象声明的初始化过程是线程安全的。

如需引用该对象,直接使用其名称即可:

DataProviderManager.registerDataProvider(……)

对象声明不能用在局部作用域,但是它们可以嵌套到其他对象声明或非内部类中。

object
class Driver

interface OnExternalDriverMountListener {

    fun onMount(driver: Driver);

    fun onUnmount(driver: Driver);

}

abstract class Player

object MusicPlayer : Player(), OnExternalDriverMountListener {

    val state: Int = 0;

    fun play(url: String) {

    }

    fun stop() {

    }

    override fun onMount(driver: Driver) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onUnmount(driver: Driver) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}
  • 只有一个实例的类
  • 不能自定义构造方法
  • 可以实现接口,继承父类
  • 本质上就是单例模式最基本的实现
伴生对象
  • 每个类可以对应一个伴生对象
  • 伴生对象的成员全局独一份
  • 伴生对象的成员类似Java的静态成员
  • 静态成员考虑用包级函数,变量替代
  • JvmStatic和JvmField的使用

类内部的对象声明可以使用companion关键字标记:

class MyClass {

    companion object Factory {
        fun create():MyClass {
            return MyClass();
        }
    }

}

该伴生对象的成员可通过只使用类名作为限定符来调用:

val instance = MyClass.create();

val instance = MyClass.Factory.create();

可以省略伴生对象的名称,在这种情况下将使用名称Companion:

class MyClass {

    companion object {
        ...
    }

}

val x = MyClass.Companion;

其自身所用的类的名称可用作对该类的伴生对象的引用:

class MyClass1 {

    companion object Named {
        
    }

}

val instance = MyClass1;

请注意,即使伴生对象的成员看起来像其他语言的静态成员,在运行时他们仍然是真实对象的实例成员,而且,例如还可以实现接口:

interface Factory {
    fun create(): T
}

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

val f: Factory = MyClass
JvmStatic和JvmField的使用
class EventBusUtils {

    companion object {

        @JvmField
        val TAG = "Kotlin";

        @JvmStatic
        fun register(obj: Any): Unit {
            EventBus.getDefault().register(obj);
        }

        fun unregister(obj: Any): Unit {
            EventBus.getDefault().unregister(this);
        }

        fun post(obj: Any): Unit {
            EventBus.getDefault().post(obj);
        }

    }

}

你可能感兴趣的:(16. 对象声明与伴生对象)