Код: Выделить всё
// this is a class that is injected into a view model, it is injected once, as a parameter
// it is used in multiple functions in the view model, some of them may happen one after another or even at once
class UseCaseProvider(repository: Repository) {
val useCaseMap = HashMap()
private val clearFiltersUseCase by lazy { ClearFiltersUseCase(repository) }
// maaaany more usecases made in the exact same way...
private fun register(useCase: UseCase) {
useCaseMap[useCase::class.java] = useCase
}
internal inline get(): T {
if(!useCaseMap.containsKey(T::class.java)){
when(T::class) {
ClearFiltersUseCase -> register(clearFiltersUseCase)
// maaaany more similar lines
else -> throw IllegalStateException("UseCase not registered")
}
}
return useCaseMap[T::class.java] as T
}
}
// example usage in the view model:
// useCaseProvider.get().invoke()
// .invoke() is always suspend
у нас есть похожая ситуация usecase-провайдера в другом модуле, но вместо использования ленивого и функции регистрации он просто создает и сохраняет экземпляры в хеш-карте после создания провайдера, и он не выходит из строя, поэтому я подозреваю, что здесь виновата какая-то ленивая?
Я принимаю любые идеи (моими единственными идеями были условия гонки для ленивого {} и потокобезопасность, но мне не удалось воспроизвести сбой)
Подробнее здесь: https://stackoverflow.com/questions/790 ... production
Мобильная версия