В Kotlin есть конструкция, которой нет в JVM:
var name by NameDelegate() // в JVM такого нет
Под капотом компилятор превращает все это в такую штуку:
// по сути в JVM нет такого поля как name, вместо этого создается объект делегата
final NameDelegate name$delegate = new NameDelegate();
// дополнительное поле которое хранит данные о свойствах, заполняется при конструировании объекта, нужно чтобы различать несколько свойств
private static final KProperty[] $$delegatedProperties;
final String getName() {
// данные о свойстве достаются просто по индексу
return name$delegate.getValue(
this,
$$delegatedProperties[0]
)
}
final void setName(String name) {
name$delegate.setValue(
this,
$$delegatedProperties[0],
name
)
}
Получается что работа со свойством просто передается другому объекту, то есть делегируется, отсюда и название "делегат".
Сам по себе делегат выглядит так:
class NameDelegate {
// operator говорит компилятору что это специальная функция, которая используется в синтаксисе языка (by)
operator fun getValue(
thisRef: User,
property: KProperty<*>
): String {
return "Volga GAZ 21"
}
operator fun setValue(
thisRef: User,
property: KProperty<*>,
value: String
) {}
}Для делегатов свойств которые не меняются (
val) setValue() не переопределяется.
