Делегирование в Kotlin

kotlin

Don’t Reinvent the Wheel, Delegate It! — статья об использовании встроенных в язык Kotlin средств делегирования реализаций классов и свойств.

Один из ключевых постулатов современного ООП-программирования гласит: «Предпочитайте делегирование наследованию». Это значит, что вместо наследования от какого-либо класса лучше включить инстанс этого класса в другой класс и вызывать его методы при вызове одноименных методов этого класса:

Зачем это нужно? Чтобы избежать проблем, когда методы класса-родителя вызывают друг друга. Если method1() вызывает method2(), то, переопределив второй метод, мы сломаем работу первого. Делегирование решает эту проблему, так как Class1 и Class2 остаются не связанными друг с другом.

С другой стороны, делегирование усложняет код, и поэтому в Kotlin есть специальное ключевое слово by, сильно упрощающее жизнь разработчику. Благодаря ему реализовать второй класс можно с помощью всего одной строки:

Это действительно все. Компилятор Kotlin автоматически преобразует эту строку в аналог реализации Class2 из первого примера.

Kotlin также позволяет делегировать реализацию свойств. В следующей записи используется стандартный делегат lazy, инициализирующий переменную при первом обращении к ней:

Еще более интересно работает делегат map, позволяющий магическим образом взять значения из хешмапа.

Кроме lazy и map, в стандартную библиотеку Kotlin включены еще три стандартных делегата:

  • nutNull — аналог ключевого слова lateinit с более широкими возможностями;
  • observable — позволяет выполнить код в момент чтения или записи переменной;
  • vetoable — похож на observable, но срабатывает перед записью нового значения и может запретить изменение.

Ну и конечно же, любой разработчик может создать собственный делегат. Это всего лишь класс c реализацией операторов getValue() и setValue():

Андрей Бреслав, ключевой разработчик Kotlin, не раз заявлял, что не стал бы реализовывать делегирование классов, будь у него возможность вернуться в прошлое. Эта функция оказалась хоть и полезной, но слишком комплексной в реализации и конфликтующей с новыми возможностями языка Java.

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (1 оценок, среднее: 5,00 из 5)
Загрузка...
Понравилась статья? Поделиться с друзьями:
Добавить комментарий