https://kotlinlang.org logo
#kodein
Title
d

dave08

09/27/2017, 4:51 PM
I tried this:
Copy code
class DeferredSingleton<T : Any>(builder: Kodein.Builder, override val createdType: TypeToken<Deferred<T>>, creator: NoArgBindingKodein.() -> T) : NoArgBinding<Deferred<T>> {
	override fun factoryName() = "deferredSingleton"

	private @Volatile var _instance: T? = null
	private val _lock = Any()

	init {
		val key = Kodein.Key(Kodein.Bind(createdType, null), erased<Unit>())
		builder.onProviderReady(key) { getInstance(this, key) }
	}

	override fun getInstance(kodein: NoArgBindingKodein, key: Kodein.Key<Unit, Deferred<T>>): Deferred<T> {
		synchronizedIfNull(_lock, this::_instance, { return it }) {
			_instance = kodein.creator()
		}
		return _instance!!
	}
}
But creator() in the class params is not the same as the one being called (which is () -> Deferred<T>), and _instance returns T? instead of Deferred<T>? Also, I really would like that
val dep by injector.instance()
would return
T
not
Deferred<T>
and that the _instance initialize would be
T
...