Kotlin — статички типизиран програмски језик компаније JetBrains, који ради на JVM и званично га подржава Google за Android развој од 2017. године. Kotlin је потпуно компатибилан са Java-ом, има концизну синтаксу и уграђену null-безбедност. Kotlin Documentation — комплетан водич кроз језик и стандардну библиотеку.
Главне карактеристике
Kotlin — статички типизиран програмски језик креиран од стране компаније JetBrains (програмера IntelliJ IDEA) и објављен 2016. године под Apache 2.0 лиценцом. Kotlin се компајлира у бајт-код JVM, JavaScript и нативни код (путем Kotlin/Native). Главна област примене — Android развој, серверске апликације и крос-платформски пројекти.
Google је прогласио Kotlin званичним језиком Android развоја на Google I/O 2017. Према подацима Google-а (Android Developer Blog, 2026), више од 85% нових пројеката у Google Play-у користи Kotlin. Језик се такође активно примењује у серверском развоју (Spring Boot, Ktor) и у мулти-платформским пројектима (Kotlin Multiplatform Mobile).
Kotlin је потпуно компатибилан са Java-ом — могуће је позивати Java код из Kotlin-а и обрнуто у оквиру истог пројекта. Алати за изградњу (Gradle, Maven) подржавају оба језика, што омогућава постепену миграцију са Java на Kotlin без застоја у развоју.
Главни разлози: концизност — Kotlin захтева у просеку 40% мање линија кода од Java за решавање истог задатка. Null-безбедност — компајлер забрањује коришћење nullable типова без провере. Функционалне могућности — функције вишег реда, ламбде, extension functions и коритине чине код изражајнијим и безбеднијим.
Основна синтакса Kotlin-а комбинује концизност са јасноћом. Променљиве се декларишу кроз val (имутабилно) и var (мутабилно). Компајлер користи type inference, али експлицитно навођење типа је подржано. Функције се декларишу кључном речи fun.
package com.example.intro
// Константе и променљиве
val appName: String = "KotlinApp" // неизмењива
var version = 1.0 // променљива, тип изведен
// Функција са expression body
fun sum(a: Int, b: Int) = a + b
// String templates
fun greet(name: String) = "Здраво, $name! Верзија ${appName}_$version"
// Default and named arguments
fun createUser(
name: String,
age: Int = 18,
email: String? = null
)When-израз замењује switch у Java и флексибилнији је: подржава проверу типова, опсеге, услове и гране без break-а. Компајлер проверава исцрпну покривеност за enum и sealed-класе. Smart casts аутоматски конвертују типове након is провере, елиминишући експлицитне кастове.
fun analyzeValue(value: Any) = when (value) {
is String -> "Стринг дужине ${value.length}" // smart cast
is Int -> "Цео број: $value"
in 1..10 -> "Број у опсегу 1-10"
else -> "Непознат тип"
}Null-безбедност — кључна карактеристика Kotlin-а која елиминише NullPointerException на нивоу компајлације. У Kotlin-у типови подразумевано не могу бити null. Да бисте дозволили null, додајте ? типу: String?. Компајлер захтева експлицитну проверу сваке nullable вредности.
// Nullable и non-null типови
val nonNull: String = "Увек non-null"
val nullable: String? = null // дозвољено
// Safe call — извршава се само ако није null
val length: Int? = nullable?.length
// Elvis operator — подразумевана вредност
val text: String = nullable ?: "Default text"
// Let — извршење блока са non-null вредношћу
nullable?.let { value ->
println("Вредност: $value")
}Safe call оператор (?.) враћа null ако је објекат испред оператора null и позива метод/својство у супротном. Elvis оператор (?:) обезбеђује подразумевану вредност ако је лева страна null. Not-null асерција (!!) баца NullPointerException ако је вредност null — користите само када сте 100% сигурни у постојање вредности.
Платформски типови (platform types) — Java типови из позиваног Java кода које Kotlin не може да означи као nullable или non-null. Тип се приказује као String! (са узвичником). Програмер је одговоран за null-безбедност при раду са Java кодом.
Data-класе у Kotlin-у аутоматски генеришу equals(), hashCode(), toString(), copy() и componentN(). Ово елиминише boilerplate Java модела (POJO) и чини код чистијим. Декларација data class-а заузима један ред уместо 20-30 у Java.
data class User(
val id: Long,
val name: String,
val email: String,
val age: Int? = null
)
// Коришћење
val user = User(1, "Ана", "anna@example.com")
val updatedUser = user.copy(age = 25)
// Деструктуризација
val (id, name) = user
println("Корисник #$id: $name")Деструктуризација омогућава разлагање data class-а на променљиве у једном реду. Ово је згодно при раду са паровима, тројкама и другим композитним вредностима. Деструктуризација је подржана за data-класе, стандардне колекције (List, Map) и све класе са operator fun componentN().
Extension functions — механизам Kotlin-а за додавање нових метода постојећим класама без наслеђивања. Проширења се компајлирају у статичке методе са receiver параметром, тако да наслеђивање није потребно и виртуалност није подржана.
// Extension function за String
fun String.isEmail(): Boolean {
return this.contains("@") && this.contains(".")
}
// Extension property
val String.isPhoneNumber: Boolean
get() = this.matches(Regex("^\\+?[\\d-]{10,15}$"))
// Generic extension за колекције
fun List<Int>.sumOfEvens(): Int {
return this.filter { it % 2 == 0 }.sum()
}
// Коришћење
println("test@mail.com".isEmail()) // trueПроширења се широко користе у Android SDK и библиотекама. На пример, Activity extensions у Android KTX су extension functions за Activity, Fragment, View и друге класе. Проширења могу бити декларисана као top-level функције у фајлу или као чланови класе (member extensions).
Coroutines — механизам асинхроног програмирања у Kotlin-у који омогућава писање неблокирајућег кода у секвенцијалном стилу. Корутина зауставља извршење на suspend-функцији без блокирања нити и наставља рад након завршетка операције. Ово је алтернатива callback ланцима RxJava и AsyncTask-у.
import kotlinx.coroutines.*
// Suspend-функција — може се зауставити
suspend fun fetchUserData(userId: Int): User {
// delay — suspend-функција, не блокира нит
delay(500)
return User(userId, "User $userId", "user@example.com")
}
// Покретање у коритини
fun loadData() {
CoroutineScope(Dispatchers.Main).launch {
val user = fetchUserData(1) // заустављање овде
updateUI(user) // наставак на главној нити
}
}Dispatchers одређују пул нити за коритину: Dispatchers.Main (UI нит), Dispatchers.IO (мрежне/диск операције), Dispatchers.Default (CPU-интензивни задаци). Structured concurrency гарантује да коритина неће остати активна након завршетка scope-а — ово спречава цурење меморије.
// Паралелно покретање путем async/await
suspend fun loadDashboard(): Dashboard = coroutineScope {
val user = async { fetchUserData(1) }
val orders = async { fetchOrders(1) }
val stats = async { fetchStats() }
Dashboard(user.await(), orders.await(), stats.await())
}Избор између Kotlin-а и Java за нови Android пројекат — фундаментална архитектонска одлука. Kotlin нуди модернију синтаксу и уграђене безбедносне механизме, Java — шири скуп програмера и зреле библиотеке.
| Карактеристика | Kotlin | Java |
|---|---|---|
| Null-безбедност | Уграђена (nullable/non-null) | Не постоји (@Nullable анотације) |
| Обим кода | −40% у односу на Java | Boilerplate (getters/setters) |
| Data-класе | data class (један ред) | POJO са Lombok или ручно |
| Асинхроност | Coroutines (suspend/await) | CompletableFuture, RxJava |
| Extension functions | Уграђене | Само кроз utility класе |
| Smart casts | Након is провере | Експлицитан каст (Type) obj |
| Повратна компатибилност | 100% са Java | — |
Перформансе Kotlin-а и Java су упоредиве — оба се компајлирају у бајт-код JVM. Kotlin понекад додаје микро-оверхед на коритине и inlining, али то је занемарљиво за мобилне апликације. Google и JetBrains активно инвестирају у Kotlin: Kotlin Multiplatform, Kotlin/Wasm и побољшање перформанси компајлера K2.
Често постављана питања
Kotlin је краћи од Java за 40% — мање boilerplate-а. Kotlin додаје null-безбедност, data-класе, extension functions, коритине, smart casts, when-изразе. Потпуна компатибилност са Java: оба језика раде на JVM и могу се користити у истом пројекту без конфликата.
Типови су подразумевано non-null. За nullable користите ?: String?. Компајлер забрањује директно обраћање nullable вредности. Safe call (?.) враћа null при null receiver. Elvis оператор (?:) поставља подразумевану вредност. !! — принудно извлачење са могућим изузетком.
Корутине — лаке нити које омогућавају писање асинхроног кода секвенцијално. suspend-функције се заустављају без блокирања нити. launch и async покрећу коритине у CoroutineScope. Dispatchers.IO за мрежне захтеве, Dispatchers.Main за UI ажурирања.
data class аутоматски генерише equals(), hashCode(), toString(), copy() и componentN(). Пример: data class User(val name: String, val age: Int). Деструктуризација кроз val (name, age) = user. Аналог record-а у Java 14+, али са додатним методом copy().
Extension functions додају методе постојећим класама: fun String.isEmail(): Boolean. Компајлер их замењује статичким позивима са receiver параметром. Наслеђивање није потребно. Проширења се широко користе у Android KTX: view.showToast(), activity.viewModels().
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође