Kotlin for Android Developers


lateinit is also indispensable when working with a dependency injector, and very useful for tests too. Values from a map


Download 1.04 Mb.
Pdf ko'rish
bet43/79
Sana18.06.2023
Hajmi1.04 Mb.
#1588404
1   ...   39   40   41   42   43   44   45   46   ...   79
Bog'liq
Kotlin for Android Developers Learn Kotlin the Easy Way While Developing an Android App ( PDFDrive )

lateinit
is also indispensable when working with a dependency injector, and very useful for tests
too.
Values from a map
Another way to delegate the values of a property is to get them from a map, using the name of the
property as the key of the map. This delegate let us do really powerful things, because we can easily
create an instance of an object from a dynamic map. If we are using immutable properties, the map
can be immutable too. For mutable properties, the class will require a
MutableMap
as constructor
parameter instead.
Imagine a configuration class we load from a Json, and assign those key and values to a map. We
could just create an instance of a class by passing this map to the constructor:
1
class Configuration(map: Map) {
2
val width: Int by map
3
val height: Int by map
4
val dp: Int by map
5
val deviceName: String by map
6
}
As a reference, here it is how we could create the necessary map for this class:


16 Application Singleton and Delegated Properties
61
1
val conf = Configuration(mapOf(
2
"width" to 1080,
3
"height" to 720,
4
"dp" to 240,
5
"deviceName" to "mydevice"
6
))
16.4 How to create a custom delegate
Let’s say we want, for instance, to create a non-nullable delegate that can be only assigned once.
Second time it’s assigned, it will throw an exception.
Kotlin library provides a couple of interfaces our delegates must implement:
ReadOnlyProperty
and
ReadWriteProperty
. The one that should be used depends on whether the delegated property is
val
or
var
.
The first thing we can do is to create a class that extends
ReadWriteProperty
:
1
private class NotNullSingleValueVar() : ReadWriteProperty {
2
3
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
4
throw UnsupportedOperationException()
5
}
6
7
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
8
9
}
10
}
This delegate can work over any non-nullable type. It will receive a reference of an object of any
type, and use
T
as the type of the getter and the setter. Now we need to implement the methods.
• The getter will return a value if it’s assigned, otherwise it will throw an exception.
• The setter will assign the value if it is still null, otherwise it will throw an exception.


16 Application Singleton and Delegated Properties
62
1
private class NotNullSingleValueVar() : ReadWriteProperty {
2
3

Download 1.04 Mb.

Do'stlaringiz bilan baham:
1   ...   39   40   41   42   43   44   45   46   ...   79




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling