如何拥有一个只能由另一个特定类实例化的类

时间:2020-07-12 14:25:31

标签: java android kotlin

我想要一个只能由另一个类实例化的类。我知道我必须将constructor设为私有,否则每个人都可以实例化它。

class Root private constructor() {
}

class RootMaker: Application() {
    fun createRoot() = Root()
} // but this doesn't work because Root's constructor is private

一种解决方法是使maker类成为Root类的内部类。

class Root private constructor() {

    class RootMaker: Application() {
        fun createRoot() = Root()
    } 
}

但是我真的不想这样做,因为maker类是我在android中的application类。那有什么更好的方法呢?

1 个答案:

答案 0 :(得分:1)

如果只需要一个对象的实例,则可以在Kotlin中使用object关键字。它实现了Singleton模式:

class App : Application {
    
    val root = Root

}

object Root {
    fun createObject(): Any {}
}

现在,我们可以通过Root类中的属性或通过App类来访问Root类的一个实例:Root.createObject()

更新:

要实现只有一个特定类可以访问的单例,我们可以使用接口并将其实现隐藏在该特定类( maker 类)中:

interface IRoot {
    // ... methods of creation different objects for dependency injection
}

class App : Application {

    val root: IRoot = Root

    // hide implementation of `IRoot` interface in `App` class
    private object Root : IRoot {

        // ... implementation of methods of creation different objects for dependency injection
    }
}