A shorter syntax would be to avoid swipeView from ever null .
Local variable
If swipeView is a local variable, you can declare it non-empty when it first assigns it:
val swipeView = ... ?: view.find<MeasureTypePieChart>(R.id.swipeableView)
Function argument
If swipeView is a function argument, you can use the default argument so that it is never null :
fun something(swipeView: View = view.find<MeasureTypePieChart>(R.id.swipeableView))
Class property
only for reading
If swipeView is a read-only class property (i.e. val ), you can use the built-in Kotlin Lazy :
val swipeView by lazy { view.find<MeasureTypePieChart>(R.id.swipeableView) }
Mutable
If swipeView is a property of a mutable class (i.e. var ), you can define your own delegate, similar to Lazy , but mutable. For example, the following is a description of kotlin / Lazy.kt :
interface MutableLazy<T> : Lazy<T> { override var value: T } fun <T> mutableLazy(initializer: () -> T): MutableLazy<T> = SynchronizedMutableLazyImpl(initializer) fun <T> mutableLazy(lock: Any?, initializer: () -> T): MutableLazy<T> = SynchronizedMutableLazyImpl(initializer, lock) operator fun <T> MutableLazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value operator fun <T> MutableLazy<T>.setValue(thisRef: Any?, property: KProperty<*>, value: T) { this.value = value } private object UNINITIALIZED_VALUE private class SynchronizedMutableLazyImpl<T>(initializer: () -> T, lock: Any? = null) : MutableLazy<T>, Serializable { private var initializer: (() -> T)? = initializer @Volatile private var _value: Any? = UNINITIALIZED_VALUE // final field is required to enable safe publication of constructed instance private val lock = lock ?: this override var value: T get() { val _v1 = _value if (_v1 !== UNINITIALIZED_VALUE) { @Suppress("UNCHECKED_CAST") return _v1 as T } return synchronized(lock) { val _v2 = _value if (_v2 !== UNINITIALIZED_VALUE) { @Suppress("UNCHECKED_CAST") (_v2 as T) } else { val typedValue = initializer!!() _value = typedValue initializer = null typedValue } } } set(value) { val _v1 = _value if (_v1 !== UNINITIALIZED_VALUE) { _value = value } else synchronized(lock) { _value = value initializer = null } } override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUE override fun toString(): String = if (isInitialized()) value.toString() else "MutableLazy value not initialized yet." }
Using:
var swipeView by mutableLazy { view.find<MeasureTypePieChart>(R.id.swipeableView) }
initializer is called only if the swipeView is swipeView read and not yet initialized (from a previous read or write).
source share