Good And Bad Practices Of Coding In Kotlin — статья о практиках программирования на Kotlin, хороших и плохих. В статье рассмотрены хорошие и плохие приемы программирования на Kotlin.
Первый пример программирования на Kotlin
1 2 3 4 5 6 7 8 9 10 11 |
fun main { val file = File("/my_file") val writer = file.printWriter() try { writer.println("Hello World") } catch(__: Exception){ // Обработка исключения } finally { writer.close() } } |
Это стандартный способ записи строки в файл: открываем файл и с помощью PrintWriter записываем строку. В завершение закрываем PrintWriter даже в том случае, если будет выброшено исключение.
Этот код можно переписать так:
1 2 3 4 5 6 |
fun main () { val file = File("/my_file") file.printWriter().use { it.println("Hello World") } } |
В случае с объектами, реализующими интерфейс Closeable (здесь PrintWriter), функция-расширение use автоматически вызывает метод close после выполнения кода лямбды.
Второй пример программирования на Kotlin
1 2 3 4 5 6 7 |
val list = listOf("Ahsen", "Bob", "Alex", "Jasmine") val anotherList = listOf(1, 2, 3, 4) fun main() { val size = list.size for(i in 0..size) println("Name -> ${list[i]} and number -> ${anotherList[i]}") } |
Этот код проходит в цикле сразу по двум спискам. Но в нем есть одна проблема: если второй список будет длиннее первого, приложение упадет с исключением ArrayIndexOutOfBoundsException.
РЕКОМЕНДУЕМ:
Классы-делегаты в Kotlin
Kotlin позволяет решить эту проблему и заодно сделать код гораздо более элегантным:
1 2 3 4 5 6 |
val list = listOf("Ahsen", "Bob", "Alex", "Jasmine") val anotherList = listOf(1, 2, 3, 4, 5, 6, 7) fun main() { for((name, number) in list.zip(anotherList)) println("Name -> $name and number -> $number") } |
Метод zip создает набор пар (pair), где первый элемент пары — значение из первого списка, второй элемент — значение из второго с тем же индексом. В этом примере пара автоматически раскладывается на переменные name и number с помощью деструктивного оператора.
Третий пример программирования на Kotlin
1 2 3 4 5 6 7 8 9 10 11 |
val firstList = listOf("Ahsen", "Bob", "Alex", "Jasmine") val secondList = listOf("Ahsen", "Jack", "Alen", "Jasmine") fun main() { val result = mutableListOf<String>().apply { addAll(secondList) } for(name in firstList) if(!secondList.contains(name)) result.add(name) println(result) } |
Данный код объединяет два однотипных списка так, чтобы их значения не повторялись. Но в Kotlin у списков есть метод union, предназначенный именно для этого:
1 2 3 4 5 6 |
val firstList = listOf("Ahsen", "Bob", "Alex", "Jasmine") val secondList = listOf("Ahsen", "Jack", "Alen", "Jasmine") fun main() { val result = firstList.union(secondList) println(result) } |
Четвертый пример программирования на Kotlin
1 2 3 4 5 |
const val NAME = "Ahsen" val x = NAME as Int fun main() { println(x) } |
Данный код выбросит исключение ClassCastException, потому что константа NAME имеет тип не Int. Чтобы такого не происходило, можно использовать оператор as?:
1 2 3 4 5 |
const val NAME = "Ahsen" val x = NAME as? Int fun main() { println(x) } |
Если приведение типов будет невозможно, переменная x получит значение null.
РЕКОМЕНДУЕМ:
Полезные советы разработчику на языке Kotlin