В Kotlin у нас есть модификатор lateinit
для отложенной инициализации переменной вместо var something: Something? = null
.
В моей ситуации у меня есть список Element
, и я хочу присвоить его переменной lateinit
, когда у меня есть первый объект.
Итак, я попробовал несколько методов для достижения этой цели.
Первый , используя методы 'firstOrNull ()'
lateinit var applicationHolder: ApplicationHolder
applicationHolder = env.getElementsAnnotatedWith(InjectApplication::class.java)
.map {
ApplicationHolder(it, (it as TypeElement).asClassName(), it.simpleName.toString()).apply {
val component = it.getAnnotation(InjectApplication::class.java).getComponent()
componentClass = component
}
}.firstOrNull()
Первое решение не удалось, потому что applicationHolder
не принимает Nullable тип ApplicationHolder.(Вывод типа не выполнен. Ожидаемое несоответствие типов: предполагаемый тип - ApplicationHolder? Но ожидаемый ApplicationHolder.)
Хотя я могу использовать first
вместо firstOrNull
, чтобы достичь этого, это слишком опасно, поскольку список может бытьпусто.
Second , с использованием условия if
val item = env.getElementsAnnotatedWith(InjectApplication::class.java)
.map {
ApplicationHolder(it, (it as TypeElement).asClassName(), it.simpleName.toString()).apply {
val component = it.getAnnotation(InjectApplication::class.java).getComponent()
componentClass = component
}
}.firstOrNull()
if (item != null) {
applicationHolder = item
}
Второе решение успешно скомпилировано и работает.
Третье, используя свойства поддержки (на самом деле, это решение не использует модификатор lateinit)
val applicationHolder: ApplicationHolder
get() {
return _applicationHolder ?: throw NullPointerException("Not initialized")
}
private var _applicationHolder: ApplicationHolder? = null
_applicationHolder = env.getElementsAnnotatedWith(InjectApplication::class.java)
.map {
ApplicationHolder(it, (it as TypeElement).asClassName(), it.simpleName.toString()).apply {
val component = it.getAnnotation(InjectApplication::class.java).getComponent()
componentClass = component
}
}.firstOrNull()
Третье решение успешно скомпилировано и работает хорошо.
Короче, мой вопросвыглядит следующим образом.
- Есть ли лучшее решение для достижения моей цели, чем эти решения?
- Если другого решения не существует, какое решение является чистым или лучшим?Я могу использовать второе или третье решение, но у меня нет уверенности, что оно чистое или лучше.