Kotlin对象类示例get()

lzfw57am  于 2023-01-02  发布在  Kotlin
关注(0)|答案(3)|浏览(216)
public class Singleton {
    private static Singleton instance = null;
    private Singleton(){
    }

    public synchronized static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        doSomeInitializationIfRequired();
        return instance;
    }
}

这里,当我们请求示例时,getInstance()方法被调用,如果我们想在每次从任何地方调用示例时做一些事情,我们可以在示例中添加代码。
有没有什么方法可以像这样用Kotlin对象覆盖示例变量get()
例如:

object SomeSingleton {
    get() = {
        doSomeInitializationIfRequired()
    }
}

我知道我能写

init {
}

但只调用一次。

j13ufse2

j13ufse21#

对于这种类型的单例,我不会使用object,您可以使用更像Java的方法。

class Singleton private constructor() {

    companion object {
        private var _instance = Singleton()
        val instance: Singleton 
            get() = synchronized(this) {
                doSomeInitializationIfRequired()
                _instance
            }
    }

}

如果您需要构造函数或doSomeInitializationIfRequired()的参数,可以将val instance替换为getInstance函数,这在Android上很常见,因为您的单例可能需要引用Application示例。

class Singleton private constructor(val application: Application) {

    companion object {
        private val instance: Singleton? = null

        fun getInstance(application: Application): Singleton = synchronized(this) {
            val value = instance ?: Singleton(application).also { instance = it }
            doSomeInitializationIfRequired(application)
            value
        }
    }

}
iqxoj9l9

iqxoj9l92#

你可以使用一点抽象,创建一个interface(不管你想给它起什么名字),并定义所有可能的方法和属性,单例应该有:

interface ISomeSingleton {
    fun something()
}

然后创建一个私有实现作为单例:

private object SingletonImpl : ISomeSingleton {
    override fun something() = println("hello")
}

最后用自定义getter定义一个顶级字段,它返回实现:

val SomeSingleton: ISomeSingleton
    get() {
        // do your fancy stuff here
        return SingletonImpl
    }

现在您可以通过SomeSingleton字段获得ISomeSingleton的示例,并且初始化代码始终运行

6vl6ewon

6vl6ewon3#

您可以为instance属性创建自定义getter函数,并在其中添加其他检查

object Singleton {
    val instance: Singleton
        get() {
            println("doing something extra")
            return this
        }
}

相关问题