ч
то
мы
узнали
В Android и iOS используются удивительно похожие подходы к сериализации
и десериализации данных в такие форматы, как XML и JSON. Существуют так
-
же аналогичные способы сериализации объектов Java, Kotlin или Swift в соб
-
ственный формат платформы. Несмотря на различия в языке и структурах, обе
платформы упрощают передачу данных.
В следующей главе мы затронем приемы расширения базовых объектов
инф раструктуры (и других объектов), позволяющие добавлять новые возмож
-
ности. Давайте посмотрим!
Глава
13
Расширения
Иногда функциональности, предлагаемой системами Android и iOS или сто
-
ронними библиотеками, оказывается недостаточно. Конечно, можно создать
свои подклассы, но это не всегда возможно.
К счастью, обе платформы имеют средства, позволяющие расширять воз
-
можности существующих объектов.
з
адачи
В этой главе вы узнаете, как добавлять новые функциональные возможности
в существующие API.
A
ndroid
Повсюду в этой книге в качестве языка по умолчанию для разработки
Android-приложений мы использовали Java. И действительно, подавляющее
большинство программ для Android пишется на языке Java. Но теперь мы
должны особо отметить, что в Android Framework только Kotlin поддерживает
возможность расширения существующих API. Что это значит? Под термином
«расширение» в данном случае мы понимаем «изменение существующих или
добавление новых функциональных возможностей в любой класс». Однако
на языке Kotlin можно писать расширения для классов на Java и успешно
пользоваться ими!
Добавление новых возможностей в существующие API
Если в программном коде на Java импортировать стороннюю библиотеку
с компонентом
CalendarPicker
, вы фактически будете ограничены общедо
-
ступным API, который предлагает эта библиотека. Конечно, можно изменить
исходный код компонента, но в результате вы получите компонент
Calendar
Picker
, который будет экземпляром совсем другого класса, отличного от ори
-
гинала. Также можно определить подкласс
CalendarPicker
, но и в этом случае
вы получите совершенно другой класс. В Java нет возможности дополнить или
изменить функциональность существующего класса
CalendarPicker
.
208
Расширения
В Kotlin дело обстоит иначе. Этот язык программирования позволит не
только добавить новый метод в
CalendarPicker
, который будет доступен всем
экземплярам
CalendarPicker
, но и расширить возможности классов в стандарт
-
ной библиотеке, таких как
LinkedList
, и даже обобщенных классов, таких как
HashSet
. На самом деле в Kotlin можно расширить даже класс
Any
и тем
самым добавить новые возможности во все его экземпляры. Вот классический
пример расширения на Kotlin:
fun Any?.toString(): String {
if (this == null) {
return "null"
}
return toString()
}
Этот код на Kotlin добавляет поддержку оператора
?
в
тело
метода
Object.
toString
. Включив этот код в свой проект, вы сможете без опаски вызвать метод
toString
для любого объекта; если объект окажется пустой ссылкой
null
, вместо
NullPointerException
вы получите строку
"null"
. И это здорово!
Расширения можно добавлять в любом месте, в любом пакете, где только по
-
желаете (лишь бы это был файл на Kotlin в каталоге
src
). Например, щелкните
правой кнопкой мыши на любом пакете в своем проекте, выберите в контекст
-
ном меню пункт
New > Kotlin File/Class
(Создать > Файл/Класс на Kotlin) и дайте
файлу любое имя, например «extensions» (Android Studio автоматически до
-
бавит расширение «.kt» и отобразит файл в списке со значком, указывающим,
что это файл на Kotlin).
Вы можете добавить в этот файл несколько функций-расширений или соз
-
дать несколько аналогичных файлов, и все эти расширения будут доступны из
любого класса на Kotlin в вашем проекте. Допустим, вы добавили следующий
вспомогательный метод в класс
String
:
fun String.from(start:String): String {
val index = indexOf(start) + start.length
return substring(index)
}
После этого в любом классе на Kotlin вы сможете вызвать его и получить
ожидаемый результат:
val original = "Hello world!"
val modified = original.from("Hello")
Log.d("MyTag", modified)
За более подробной информацией о расширениях в Kotlin обращайтесь к до
-
кументации разработчика (
https://oreil.ly/oGVHb
).
Do'stlaringiz bilan baham: |