Ленивый {} вызывает исключение приведения в производстве/хэш-карте, теряющую значения после назначенияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ленивый {} вызывает исключение приведения в производстве/хэш-карте, теряющую значения после назначения

Сообщение Anonymous »

у нас есть код, похожий на этот небольшой пример:

Код: Выделить всё

// 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 приводится значение null, есть идеи, почему это может происходить?
у нас есть похожая ситуация usecase-провайдера в другом модуле, но вместо использования ленивого и функции регистрации он просто создает и сохраняет экземпляры в хеш-карте после создания провайдера, и он не выходит из строя, поэтому я подозреваю, что здесь виновата какая-то ленивая?
Я принимаю любые идеи (моими единственными идеями были условия гонки для ленивого {} и потокобезопасность, но мне не удалось воспроизвести сбой)

Подробнее здесь: https://stackoverflow.com/questions/790 ... lues-after
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»