Kotlin — staticky typovaný programovací jazyk od JetBrains, běžící na JVM a oficiálně podporovaný Googlem pro vývoj Androidu od roku 2017. Kotlin je plně kompatibilní s Javou, má stručnou syntaxi a vestavěnou null-bezpečnost. Kotlin Documentation — kompletní průvodce jazykem a standardní knihovnou.
Hlavní body
Kotlin — staticky typovaný programovací jazyk vytvořený společností JetBrains (tvůrcem IntelliJ IDEA) a vydaný v roce 2016 pod licencí Apache 2.0. Kotlin se kompiluje do bytekódu JVM, JavaScriptu a nativního kódu (přes Kotlin/Native). Hlavní oblast použití — vývoj Androidu, serverové aplikace a multiplatformní projekty.
Google prohlásil Kotlin oficiálním jazykem vývoje Androidu na Google I/O 2017. Podle údajů Google (Android Developer Blog, 2026) více než 85% nových projektů v Google Play používá Kotlin. Jazyk je také aktivně využíván při vývoji serverů (Spring Boot, Ktor) a v multiplatformních projektech (Kotlin Multiplatform Mobile).
Kotlin je plně kompatibilní s Javou — lze volat Java kód z Kotlinu a naopak v rámci jednoho projektu. Nástroje pro sestavení (Gradle, Maven) podporují oba jazyky, což umožňuje postupnou migraci z Javy na Kotlin bez prostojů ve vývoji.
Hlavní důvody: stručnost — Kotlin vyžaduje v průměru o 40% méně řádků kódu než Java pro stejný úkol. Null-bezpečnost — kompilátor zakazuje používání nullable typů bez kontroly. Funkcionální možnosti — funkce vyššího řádu, lambdy, extension functions a korutiny činí kód výraznějším a bezpečnějším.
Základní syntaxe Kotlinu kombinuje stručnost s jasností. Proměnné se deklarují pomocí val (neměnná) a var (měnná). Kompilátor používá type inference, ale explicitní uvedení typu je podporováno. Funkce se deklarují klíčovým slovem fun.
package com.example.intro
// Konstanty a proměnné
val appName: String = "KotlinApp" // neměnná
var version = 1.0 // měnná, typ odvozen
// Funkce s expression body
fun sum(a: Int, b: Int) = a + b
// String templates
fun greet(name: String) = "Ahoj, $name! Verze ${appName}_$version"
// Default and named arguments
fun createUser(
name: String,
age: Int = 18,
email: String? = null
)When-výraz nahrazuje switch v Javě a je flexibilnější: podporuje kontrolu typů, rozsahy, podmínky a větve bez break. Kompilátor kontroluje vyčerpávající pokrytí pro enum a sealed třídy. Smart casts automaticky převádějí typy po kontrole is, čímž eliminují explicitní přetypování.
fun analyzeValue(value: Any) = when (value) {
is String -> "Řetězec délky ${value.length}" // smart cast
is Int -> "Celé číslo: $value"
in 1..10 -> "Číslo v rozsahu 1-10"
else -> "Neznámý typ"
}Null-bezpečnost — klíčová vlastnost Kotlinu, která eliminuje NullPointerException na úrovni kompilace. V Kotlinu typy ve výchozím nastavení nemohou být null. Chcete-li povolit null, přidejte ? k typu: String?. Kompilátor vyžaduje explicitní kontrolu každé nullable hodnoty.
// Nullable a non-null typy
val nonNull: String = "Vždy non-null"
val nullable: String? = null // povoleno
// Safe call — provede se pouze pokud není null
val length: Int? = nullable?.length
// Elvis operátor — výchozí hodnota
val text: String = nullable ?: "Default text"
// Let — provedení bloku s non-null hodnotou
nullable?.let { value ->
println("Hodnota: $value")
}Safe call operátor (?.) vrací null, pokud je objekt před operátorem null, a volá metodu/vlastnost v opačném případě. Elvis operátor (?:) poskytuje výchozí hodnotu, pokud je levá strana null. Not-null assertion (!!) vyhazuje NullPointerException, pokud je hodnota null — používejte pouze když jste si 100% jisti existencí hodnoty.
Platformní typy (platform types) — Java typy z volaného Java kódu, které Kotlin nemůže označit jako nullable nebo non-null. Typ se zobrazuje jako String! (s vykřičníkem). Vývojář je sám odpovědný za null-bezpečnost při práci s Java kódem.
Data třídy v Kotlinu automaticky generují equals(), hashCode(), toString(), copy() a componentN(). To eliminuje boilerplate Java modelů (POJO) a činí kód čistším. Deklarace data class zabírá jeden řádek místo 20-30 v Javě.
data class User(
val id: Long,
val name: String,
val email: String,
val age: Int? = null
)
// Použití
val user = User(1, "Anna", "anna@example.com")
val updatedUser = user.copy(age = 25)
// Destrukturalizace
val (id, name) = user
println("Uživatel #$id: $name")Destrukturalizace umožňuje rozložit data class na proměnné v jednom řádku. To je výhodné při práci s páry, trojicemi a dalšími složenými hodnotami. Destrukturalizace je podporována pro data třídy, standardní kolekce (List, Map) a jakékoli třídy s operator fun componentN().
Extension functions — mechanismus Kotlinu pro přidávání nových metod k existujícím třídám bez dědičnosti. Rozšíření se kompilují do statických metod s parametrem receiver, takže dědičnost není vyžadována a virtualita není podporována.
// Extension function pro 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 pro kolekce
fun List<Int>.sumOfEvens(): Int {
return this.filter { it % 2 == 0 }.sum()
}
// Použití
println("test@mail.com".isEmail()) // trueRozšíření jsou široce používána v Android SDK a knihovnách. Například Activity extensions v Android KTX jsou extension functions pro Activity, Fragment, View a další třídy. Rozšíření mohou být deklarována jako top-level funkce v souboru nebo jako členové třídy (member extensions).
Coroutines — mechanismus asynchronního programování v Kotlinu umožňující psát neblokující kód v sekvenčním stylu. Korutina pozastavuje provádění na suspend-funkci bez blokování vlákna a obnovuje práci po dokončení operace. To je alternativa k řetězcům callbacků RxJava a AsyncTask.
import kotlinx.coroutines.*
// Suspend-funkce — může se pozastavit
suspend fun fetchUserData(userId: Int): User {
// delay — suspend-funkce, neblokuje vlákno
delay(500)
return User(userId, "User $userId", "user@example.com")
}
// Spuštění v korutině
fun loadData() {
CoroutineScope(Dispatchers.Main).launch {
val user = fetchUserData(1) // pozastavení zde
updateUI(user) // pokračování na hlavním vlákně
}
}Dispatchers určují fond vláken pro korutinu: Dispatchers.Main (UI vlákno), Dispatchers.IO (síťové/disk operace), Dispatchers.Default (CPU-intenzivní úkoly). Structured concurrency garantuje, že korutina nezůstane aktivní po skončení scope — to zabraňuje únikům paměti.
// Paralelní spuštění pomocí 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())
}Volba mezi Kotlinem a Javou pro nový Android projekt — zásadní architektonické rozhodnutí. Kotlin nabízí modernější syntaxi a vestavěné bezpečnostní mechanismy, Java — širší fond vývojářů a vyspělé knihovny.
| Vlastnost | Kotlin | Java |
|---|---|---|
| Null-bezpečnost | Vestavěná (nullable/non-null) | Chybí (@Nullable anotace) |
| Objem kódu | −40% oproti Javě | Boilerplate (getters/setters) |
| Data třídy | data class (jeden řádek) | POJO s Lombokem nebo ručně |
| Asynchronicita | Coroutines (suspend/await) | CompletableFuture, RxJava |
| Extension functions | Vestavěné | Pouze přes utility třídy |
| Smart casts | Po is kontrole | Explicitní přetypování (Type) obj |
| Zpětná kompatibilita | 100% s Javou | — |
Výkon Kotlinu a Javy je srovnatelný — oba se kompilují do bytekódu JVM. Kotlin někdy přidává mikro-režii na korutiny a inlining, ale to je pro mobilní aplikace zanedbatelné. Google a JetBrains aktivně investují do Kotlinu: Kotlin Multiplatform, Kotlin/Wasm a zlepšení výkonu kompilátoru K2.
Často kladené otázky
Kotlin je kratší než Java o 40% — méně boilerplate. Kotlin přidává null-bezpečnost, data třídy, extension functions, korutiny, smart casts, when-výrazy. Plná kompatibilita s Javou: oba jazyky běží na JVM a mohou být použity v jednom projektu bez konfliktů.
Typy jsou ve výchozím nastavení non-null. Pro nullable použijte ?: String?. Kompilátor zakazuje přímý přístup k nullable hodnotě. Safe call (?.) vrací null při null receiver. Elvis operátor (?:) nastaví výchozí hodnotu. !! — vynucené získání s možnou výjimkou.
Korutiny — odlehčená vlákna, umožňující psát asynchronní kód sekvenčně. Suspend-funkce se pozastaví bez blokování vlákna. launch a async spouští korutiny v CoroutineScope. Dispatchers.IO pro síťové požadavky, Dispatchers.Main pro aktualizace UI.
data class automaticky generuje equals(), hashCode(), toString(), copy() a componentN(). Příklad: data class User(val name: String, val age: Int). Destrukturalizace pomocí val (name, age) = user. Obdoba record v Javě 14+, ale s dodatečnou metodou copy().
Extension functions přidávají metody k existujícím třídám: fun String.isEmail(): Boolean. Kompilátor je nahrazuje statickými voláními s parametrem receiver. Dědičnost není vyžadována. Rozšíření jsou široce používána v Android KTX: view.showToast(), activity.viewModels().
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také