Ответ 1
В ссылке Kotlin вы найдете два варианта использования by
, первый из которых - делегированные свойства которое вы используете выше:
Существуют определенные общие виды свойств, которые, хотя мы можем реализовать их вручную каждый раз, когда они нам понадобятся, было бы очень приятно реализовать раз и навсегда и поместить в библиотеку. Примеры включают ленивые свойства: значение вычисляется только при первом доступе, наблюдаемые свойства: слушатели получают уведомление об изменениях в этом свойстве, сохраняя свойства на карте, а не в отдельном поле.
Здесь вы делегируете getter/setter другому классу, который выполняет эту работу, и может содержать общий код. В качестве другого примера некоторые инжекторы зависимостей для Kotlin поддерживают эту модель, делегируя получателю получение значения из реестра экземпляров, управляемых механизмом впрыска зависимостей.
И Передача интерфейса/класса - это другое использование:
Схема делегирования оказалась хорошей альтернативой наследованию реализации, и Kotlin поддерживает ее, требуя нулевой код шаблона. Класс Derived может наследовать от интерфейса Base и делегировать все его общедоступные методы указанному объекту
Здесь вы можете делегировать интерфейс другой реализации, чтобы класс реализации должен был переопределять то, что он хочет изменить, а остальные методы передают обратно в более полную реализацию.
В качестве примера можно привести Klutter Readonly/Immutable collections, где они просто делегируют конкретный интерфейс коллекции другому классу, а затем переопределяют все, что должно быть другим в только для чтения. Сохранение большой работы, не требующей вручную делегировать все другие методы.
Оба из них охватываются ссылкой ссылка на язык Kotlin, начните там для базовых тем языка.