Maksim Vlasov
08/05/2019, 10:21 AMgildor
08/05/2019, 10:22 AMMaksim Vlasov
08/05/2019, 10:26 AMMaksim Vlasov
08/05/2019, 10:27 AMspand
08/05/2019, 10:29 AMgildor
08/05/2019, 10:32 AMMaksim Vlasov
08/05/2019, 10:33 AMgildor
08/05/2019, 10:33 AMMaksim Vlasov
08/05/2019, 10:33 AMBig Chungus
08/05/2019, 10:36 AMBig Chungus
08/05/2019, 10:37 AMisLocked
property uppon setter invocation which is false by default and throw an exception if it's true. finally have a lock() method in your entity to set it to true when you;re done mutating.Big Chungus
08/05/2019, 10:38 AMMaksim Vlasov
08/05/2019, 10:39 AMMaksim Vlasov
08/05/2019, 10:40 AMBig Chungus
08/05/2019, 10:50 AMabstract class LockableEntity(isLocked: Boolean = false) {
private var isLocked = false
fun lock() {
isLocked = true
}
protected class LockableProperty<T>(initialValue: T) {
private var value: T = initialValue
operator fun getValue(thisRef: LockableEntity, prop: KProperty<*>): T {
return value
}
operator fun setValue(thisRef: LockableEntity, prop: KProperty<*>, value: T) {
if (!thisRef.isLocked) {
this.value = value
} else {
throw IllegalStateException("${thisRef::class.simpleName} is locked! Further property modification is forbidden")
}
}
}
}
class SomeHibernateEntity() : LockableEntity() {
var x: String by LockableProperty("Initial")
}
fun main() {
val tmp = SomeHibernateEntity()
tmp.x = "modified"
tmp.lock()
tmp.x = "Shouldn't succeed"
}
Maksim Vlasov
08/05/2019, 10:59 AMgildor
08/05/2019, 10:59 AMBig Chungus
08/05/2019, 11:08 AMval x:Any = ???
Big Chungus
08/05/2019, 11:12 AMimport kotlin.reflect.*
abstract class LockableEntity(private var isLocked: Boolean = false) {
fun lock() {
isLocked = true
}
protected class LockableProperty<T>(initialValue: T) {
private var value: T = initialValue
operator fun getValue(thisRef: LockableEntity, prop: KProperty<*>): T {
return value
}
operator fun setValue(thisRef: LockableEntity, prop: KProperty<*>, value: T) {
if (!thisRef.isLocked) {
this.value = value
} else {
throw IllegalStateException("${thisRef::class.simpleName} is locked! Further property modification is forbidden")
}
}
}
}
class SomeHibernateEntity(x: String, y: Int, val immutable: Int) : LockableEntity() {
var x by LockableProperty<String>(x)
var y: Int by LockableProperty(y)
}
fun main() {
val tmp = SomeHibernateEntity("1", 2, 3)
tmp.x = "1 modified"
tmp.lock()
tmp.x = "Shouldn't succeed"
}
Big Chungus
08/05/2019, 11:23 AMinterface ILockableEntity {
fun isLocked(): Boolean
fun lock()
class LockableProperty<T>(initialValue: T) {
private var value: T = initialValue
operator fun getValue(thisRef: ILockableEntity, prop: KProperty<*>): T {
return value
}
operator fun setValue(thisRef: ILockableEntity, prop: KProperty<*>, value: T) {
if (!thisRef.isLocked()) {
this.value = value
} else {
throw IllegalStateException("${thisRef::class.simpleName} is locked! Further property modification is forbidden")
}
}
}
}
class SomeHibernateEntity(x: String, y: Int, val immutable: Int) : ILockableEntity {
private var locked = false
override fun isLocked() = locked
override fun lock() {
locked = true
}
var x by ILockableEntity.LockableProperty(x)
var y: Int by ILockableEntity.LockableProperty(y)
}
fun main() {
val tmp = SomeHibernateEntity("1", 2, 3)
tmp.x = "1 modified"
tmp.lock()
tmp.x = "Shouldn't succeed"
}
Big Chungus
08/05/2019, 11:25 AMinterface ILockableEntity {
val isLocked:Boolean
fun lock()
class LockableProperty<T>(initialValue: T) {
private var value: T = initialValue
operator fun getValue(thisRef: ILockableEntity, prop: KProperty<*>): T {
return value
}
operator fun setValue(thisRef: ILockableEntity, prop: KProperty<*>, value: T) {
if (!thisRef.isLocked) {
this.value = value
} else {
throw IllegalStateException("${thisRef::class.simpleName} is locked! Further property modification is forbidden")
}
}
}
}
class SomeHibernateEntity(x: String, y: Int, val immutable: Int) : ILockableEntity {
override val isLocked: Boolean
get() = locked
private var locked = false
override fun lock() {
locked = true
}
var x by ILockableEntity.LockableProperty(x)
var y: Int by ILockableEntity.LockableProperty(y)
}
fun main() {
val tmp = SomeHibernateEntity("1", 2, 3)
tmp.x = "1 modified"
tmp.lock()
tmp.x = "Shouldn't succeed"
}
streetsofboston
08/05/2019, 12:19 PMoverride var
on a val
)karelpeeters
08/05/2019, 2:27 PMlistOf
does.gildor
08/05/2019, 2:54 PMDico
08/05/2019, 5:14 PMBig Chungus
08/05/2019, 6:31 PMMaksim Vlasov
08/06/2019, 11:23 AMgildor
08/07/2019, 1:58 AMcopy
way.