Целесообразность использования IODH в Kotlin
Шаблон IODH использует механизм загрузки классов Java для обеспечения отложенной инициализации синглтонов в потокобезопасном режиме без явной синхронизации.
В Java:
public class SingletonIODH {
private SingletonIODH() {}
private static class Holder {
private static final SingletonIODH INSTANCE = a new SingletonIODH();
}
public static SingletonIODH getInstance() {
return Holder.INSTANCE;
}
}
В Kotlin:
class SingletonIODH private constructor() {
companion object {
val instance: SingletonIODH by lazy { Holder.INSTANCE }
}
private object Holder {
val INSTANCE = SingletonIODH()
}
}
Но в Kotlin делегат by lazy сам по себе делает все то для чего предназначен этот шаблон - однократная отложенная инициализация синглтона в потокобезопасном режиме.
class Singleton private constructor() {
companion object {
val instance by lazy { Singleton() }
}
}
Является ли lazy полноценной заменой IODH в Kotlin или существуют ситуации где IODH будет предпочтителен?
Источник: Stack Overflow на русском