有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Kotlin对象类实例get()

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 {
}

但这只会被调用一次


共 (1) 个答案

  1. # 1 楼答案

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

    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的实例。你的初始化代码总是在运行