kirillrakhman
06/12/2017, 12:15 PMinterface LockableHolder {
val isLocked: Boolean
}
fun <T> LockableHolder.delegate(t: T) = LockableDelegate(this, t)
class LockableDelegate<out T>(
private val holder: LockableHolder,
private val t: T
) : ReadOnlyProperty<LockableHolder, T> {
override fun getValue(thisRef: LockableHolder, property: KProperty<*>): T {
if (holder.isLocked) throw IllegalStateException("Already locked")
return t
}
}
class Connection : LockableHolder {
override var isLocked: Boolean = false
private set
val string by delegate("foo")
val int by delegate(42)
fun lock() {
isLocked = true
}
}