Delegate is just class ,that help us to seperate all logic of getter and setters so it can be reused .
if want to use same code for more than one property ,then don't need to apply same code for every property ex:
/* dont need to write this code */
class User{
var firstName:String? =null
set(value){
if(value!= null )
field = value.trim()
}
var lastName:String? = null
set(value){
if(value!= null )
field = value.trim()
}
}
use this code
class User{
var firstName:String? by TrimDelegate()
var lastName:String? by TrimDelegate()
// to print object
override fun toString():String{
return "$firstName $lastName"
}
}
create custom Delegate class and name it TrimDelegate
class TrimDelegate {
private var trimmedString:String ? = null
// thisRef is calling object
operator fun setValue( thisRef:Any,property:KProperty<*>, value:String?){
// (thisRef as User).firstName // to access member
value?.let {
trimmedString = it.trim()
}
}
operator fun getValue(thisRef:Any, property:KProperty<*>):String?{
return trimmedString
}
}
fun main(args: Array<String>) {
val user1 = User()
user1.firstName = " justin "
user1.lastName = " Bieber "
print(user1.firstName ) // justin
print("\n$user1")//justin Bieber
}
Top comments (0)