Kotlin dilemma: Extension or Member — статья о том, в каких случаях стоит использовать функции-расширения, а в каких нет.
Другие полезные статьи на тему Kotlin:
- Как сделать код на Kotlin более понятным
- Шпаргалка по коллекциям Kotlin
- Хорошие и плохие приемы программирования на Kotlin
- Основы функционального программирования на Kotlin
Функции-расширения — это методы, которые можно добавить к любому классу вне зависимости от того, имеете вы доступ к его исходному коду или нет. Например:
1 2 3 4 5 6 |
fun String.isPalindrome() : Boolean { //... } val str = "aabbaa" val result = str.isPalindrome() |
Это весьма удобный инструмент, который при неправильном использовании может принести массу проблем. В основном эти проблемы возникают, когда разработчики пытаются использовать функции-расширения в собственных классах вместо создания стандартных методов. Есть всего несколько примеров, когда это может быть оправданно.
- Inline-функции. Существует известная рекомендация, что функции высшего порядка стоит помечать с помощью ключевого слова inline. Тогда компилятор включит их код прямо на место вызова, вместо того чтобы делать настоящий вызов. Kotlin не позволяет делать инлайновыми методы класса, но позволяет делать инлайновыми функции-расширения.
- Объект со значением null. В отличие от классических методов, функции-расширения можно создать даже для nullable-типов. Например:
1 2 3 4 5 6 |
fun CharSequence?.isNullOrBlank(): Boolean { // ... } val str : String? = "I am nullable" assertThat(str.isNullOrBlank()).isFalse() |