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 {
}
但只调用一次。
3条答案
按热度按时间j13ufse21#
对于这种类型的单例,我不会使用
object
,您可以使用更像Java的方法。如果您需要构造函数或
doSomeInitializationIfRequired()
的参数,可以将val instance
替换为getInstance
函数,这在Android上很常见,因为您的单例可能需要引用Application示例。iqxoj9l92#
你可以使用一点抽象,创建一个
interface
(不管你想给它起什么名字),并定义所有可能的方法和属性,单例应该有:然后创建一个私有实现作为单例:
最后用自定义getter定义一个顶级字段,它返回实现:
现在您可以通过
SomeSingleton
字段获得ISomeSingleton
的示例,并且初始化代码始终运行6vl6ewon3#
您可以为
instance
属性创建自定义getter
函数,并在其中添加其他检查