Delegated Properties in Kotlin (#2357)
This produces a fake Database representation - working in terms of hardcoded data, a Delegate that loads values from this fake Database, and then a class with fields delegated to the fake database.
This commit is contained in:
parent
f02d117223
commit
8137c20349
|
@ -0,0 +1,35 @@
|
||||||
|
package com.baeldung.kotlin.delegates
|
||||||
|
|
||||||
|
val data = arrayOf<MutableMap<String, Any?>>(
|
||||||
|
mutableMapOf(
|
||||||
|
"id" to 1,
|
||||||
|
"name" to "George",
|
||||||
|
"age" to 4
|
||||||
|
),
|
||||||
|
mutableMapOf(
|
||||||
|
"id" to 2,
|
||||||
|
"name" to "Charlotte",
|
||||||
|
"age" to 2
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
class NoRecordFoundException(id: Int) : Exception("No record found for id $id") {
|
||||||
|
init {
|
||||||
|
println("No record found for ID $id")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun queryForValue(field: String, id: Int): Any {
|
||||||
|
println("Loading record $id from the fake database")
|
||||||
|
val value = data.firstOrNull { it["id"] == id }
|
||||||
|
?.get(field) ?: throw NoRecordFoundException(id)
|
||||||
|
println("Loaded value $value for field $field of record $id")
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun update(field: String, id: Int, value: Any?) {
|
||||||
|
println("Updating field $field of record $id to value $value in the fake database")
|
||||||
|
data.firstOrNull { it["id"] == id }
|
||||||
|
?.put(field, value)
|
||||||
|
?: throw NoRecordFoundException(id)
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.baeldung.kotlin.delegates
|
||||||
|
|
||||||
|
import kotlin.properties.ReadWriteProperty
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
class DatabaseDelegate<in R, T>(private val field: String, private val id: Int) : ReadWriteProperty<R, T> {
|
||||||
|
override fun getValue(thisRef: R, property: KProperty<*>): T =
|
||||||
|
queryForValue(field, id) as T
|
||||||
|
|
||||||
|
override fun setValue(thisRef: R, property: KProperty<*>, value: T) {
|
||||||
|
update(field, id, value)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package com.baeldung.kotlin.delegates
|
||||||
|
|
||||||
|
class User(val id: Int) {
|
||||||
|
var name: String by DatabaseDelegate("name", id)
|
||||||
|
var age: Int by DatabaseDelegate("age", id)
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.baeldung.kotlin.delegates
|
||||||
|
|
||||||
|
import org.junit.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class DatabaseDelegatesTest {
|
||||||
|
@Test
|
||||||
|
fun testGetKnownFields() {
|
||||||
|
val user = User(1)
|
||||||
|
assertEquals("George", user.name)
|
||||||
|
assertEquals(4, user.age)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSetKnownFields() {
|
||||||
|
val user = User(2)
|
||||||
|
user.age = 3
|
||||||
|
assertEquals(3, user.age)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = NoRecordFoundException::class)
|
||||||
|
fun testGetKnownField() {
|
||||||
|
val user = User(3)
|
||||||
|
user.name
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue