Используя KMutableProperty0
, вы технически выставляете объект, который можно использовать для отражения. Если вы хотите быть строгим во избежании отражения, вы можете использовать отдельные ссылки на функции для метода получения и установки. Обратите внимание, что нет необходимости передавать лямбду как ссылку на функцию в функцию более высокого порядка. Компилятор может интерпретировать ссылки на свойства как функции, если эффективная сигнатура совпадает. Это, к сожалению, означало бы необходимость дважды передавать ссылку на свойство. К сожалению, сеттер должен быть извлечен через то, что технически является отражением в этом случае:
class Test (var x: Int)
fun foo(getter: () -> Int, setter: (Int) -> Unit) {
//...
}
val test = Test(1)
foo(test::x, test::x.setter)
// Zero reflection call:
foo(test::x) { test.x = it }
В какой-то момент вы должны задаться вопросом, насколько сильно вы хотите избежать отражения, потому что приведенный выше код выглядит для меня очень грязно , Если ваш класс использует ссылку KMutableProperty0
, его гораздо проще использовать. Пока ваша принимающая функция не использует ссылку для внутреннего анализа кода, а только вызывает get()
или set()
, вы на самом деле не используете рефлексию в способах, которые рекомендуется избегать.
fun foo(property: KMutableProperty0<Int>) {
//...
}
val test = Test(1)
foo(test::x)