kotlin (s krátkým o, přízvuk na první slabice)TakéKotlin/JVM, Kotlin MultiplatformPokročilý
Definice
Kotlin je staticky typovaný programovací jazyk od firmy JetBrains, který se překládá do bajtkódu JVM, JavaScriptu i nativního kódu a je plně kompatibilní s Javou. Google jej od roku 2019 doporučuje jako preferovaný jazyk pro vývoj aplikací na Androidu. Přináší nullovou bezpečnost v typovém systému, korutiny a stručnější zápis než Java.
Odkud se Kotlin vzal
Kotlin vznikl v JetBrains, tedy u firmy, která vyrábí vývojová prostředí a měla velmi konkrétní motivaci: psát rozsáhlé nástroje v Javě bylo pomalé na psaní i na čtení. Cílem tedy nebyl akademicky čistý jazyk, ale praktická náhrada Javy, která se dá zavádět postupně soubor po souboru. Kotlin se kompiluje do stejného bajtkódu, běží na stejném JVM a volá stejné knihovny. První stabilní verze vyšla v roce 2016, o tři roky později Google oznámil, že vývoj Androidu je nadále orientovaný primárně na Kotlin.
Co typový systém řeší jinak než Java
Zásadní rozdíl je v tom, že Kotlin bere null jako součást typu. Typ String nesmí obsahovat null, String? smí, a překladač na tom trvá. Volání metody na nullovatelné hodnotě se musí ošetřit operátorem ?., dosadit náhradu přes ?: nebo explicitně vynutit pomocí !!. Tím se velká část chyb typu NullPointerException přesouvá z běhu programu do kompilace.
Ke stručnosti přispívají další věci: datové třídy generují equals, hashCode a copy samy, when nahrazuje řetězce podmínek, rozšiřující funkce dovolí přidat metodu k cizí třídě bez dědičnosti a vlastnosti nahrazují dvojice getter/setter.
Korutiny místo vláken
Asynchronní kód řeší Kotlin korutinami. Funkce označená suspend se může uprostřed pozastavit a uvolnit vlákno jinému úkolu, aniž by programátor psal callbacky nebo řetězil futures. V praxi to znamená, že síťové volání na Androidu vypadá jako obyčejný sekvenční kód, ale neblokuje hlavní vlákno. Součástí je i strukturovaná konkurence: potomci se ruší spolu s rodičovským scope, takže po zavření obrazovky nezůstávají viset rozdělané požadavky.
Kam všude Kotlin cílí
Nejrozšířenější je Kotlin/JVM: Android, serverové služby (Spring Boot, Ktor), build skripty Gradle. Kotlin Multiplatform navíc umí přeložit sdílenou byznys logiku do JavaScriptu, do nativního kódu pro iOS přes LLVM a do WebAssembly. Sdílí se typicky datová vrstva a doménová logika, zatímco uživatelské rozhraní zůstává platformní. To je jiný přístup než u nativních aplikací psaných dvakrát od nuly i než u webových obálek.
Co Kotlin stojí
Kompilace bývá pomalejší než u Javy, hlavně kvůli inline funkcím a generování. Interoperabilita s Javou je obousměrná, ale platformní typy přicházející z javového kódu nemají zaručenou nullovatelnost, takže bezpečnost na hranici není absolutní. U Kotlin Multiplatform je nutné počítat s tím, že ekosystém knihoven je menší než na JVM a některé části se stále vyvíjejí rychleji, než je pro dlouhodobě udržovaný produkt pohodlné.
Příklady z praxe
Nullová bezpečnost v praxi
Formulář vrací e-mail, který uživatel nemusel vyplnit. V Kotlinu se to modeluje typem String? a překladač nedovolí zavolat metodu bez ošetření. Kód, který by v Javě spadl až u zákazníka na NullPointerException, se tady nepřeloží.
val email: String? = form.get("email") // nepřeloží se: email.lowercase() val normalized = email?.trim()?.lowercase() ?: "neuvedeno" if (email != null) { // chytré přetypování: uvnitř bloku je email typu String println(email.length) }Načtení dat na Androidu bez blokování UI
Obrazovka se seznamem objednávek potřebuje data z API. Korutina ve viewModelScope zavolá suspend funkci repozitáře, vlákno se mezitím uvolní pro vykreslování a po zavření obrazovky se rozdělaný požadavek automaticky zruší.
class OrdersViewModel(private val repo: OrderRepository) : ViewModel() { val state = MutableStateFlow<List<Order>>(emptyList()) fun load() = viewModelScope.launch { val orders = withContext(Dispatchers.IO) { repo.fetchOrders() } state.value = orders } }
Časté omyly
- MýtusKotlin nahradil Javu, takže se Javu už není potřeba učit.
- Ve skutečnostiKotlin běží na JVM a používá javové knihovny, javové výjimky i javový model paměti. Bez znalosti běhového prostředí Javy se u serverových aplikací ani u Androidu daleko nedostanete a stack trace stejně čtete v javových třídách.
- MýtusKotlin je jazyk pro Android.
- Ve skutečnostiAndroid je největší uživatel Kotlinu, ale zdaleka ne jediný. Kotlin se běžně používá pro backend (Spring Boot, Ktor), pro build skripty Gradle a přes Kotlin Multiplatform i pro iOS, web a desktop.
- MýtusKotlin Multiplatform znamená, že se aplikace napíše jednou pro Android i iOS.
- Ve skutečnostiKotlin Multiplatform sdílí typicky doménovou a datovou vrstvu, zatímco uživatelské rozhraní se obvykle píše nativně (Compose, SwiftUI). Compose Multiplatform sdílení UI umožňuje, ale je to volba navíc, ne automatický důsledek.
Časté dotazy
- Lze Kotlin zavést do existujícího javového projektu postupně?
- Kotlin je navržený přesně pro postupné zavádění. V jednom modulu mohou koexistovat soubory .java a .kt, obojí se překládá do stejného bajtkódu a volá se navzájem bez adaptérů. Obvyklý postup je psát v Kotlinu nový kód a starý javový nechat být, případně převádět jednotlivé třídy tam, kde se stejně sahá do kódu. IntelliJ IDEA nabízí automatický převod Javy do Kotlinu, jehož výsledek je ale potřeba projít ručně, hlavně kvůli nullovatelnosti a zbytečně upovídaným konstrukcím.
- Zpomalí Kotlin běh aplikace oproti Javě?
- Kotlin generuje bajtkód pro JVM, takže za běhu je výkon srovnatelný s Javou a rozdíly jsou obvykle v šumu měření. Cenou jsou spíše doby překladu, které bývají delší, a mírně větší výsledný artefakt kvůli standardní knihovně Kotlinu (u Androidu to řeší minifikace). Vyšší abstrakce jako lambdy nebo sekvence mohou v horkých smyčkách alokovat víc objektů, na to Kotlin nabízí inline funkce a hodnotové třídy.
- K čemu jsou v Kotlinu korutiny, když existují vlákna?
- Korutiny v Kotlinu jsou mnohem levnější než vlákna operačního systému: pozastavená korutina nedrží vlákno ani zásobník, takže jich mohou běžet desítky tisíc. Asynchronní kód se navíc píše sekvenčně, bez callbacků. Klíčovou přidanou hodnotou je strukturovaná konkurence: korutiny mají rodiče, dědí rušení a chyby se propagují nahoru, takže po zrušení obrazovky nebo požadavku nezůstávají osiřelé úlohy běžet na pozadí.
- Je Kotlin vhodný pro backend, nebo se hodí hlavně na mobil?
- Kotlin je pro backend plnohodnotná volba. Běží na JVM, takže má přístup k celému ekosystému Javy včetně Springu, Hibernate, Kafky nebo JDBC ovladačů. Spring Boot má oficiální podporu Kotlinu, JetBrains navíc vyvíjí vlastní framework Ktor postavený na korutinách. Praktické výhody jsou stejné jako na Androidu: nullová bezpečnost, datové třídy pro DTO a asynchronní zpracování bez reaktivních řetězců, které se špatně ladí.
- Jak je to s licencí a otevřeností Kotlinu?
- Kotlin je open source pod licencí Apache 2.0 a zdrojové kódy překladače jsou veřejné. Vývoj vede JetBrains, na správu jazyka a jeho směřování ale vznikla Kotlin Foundation, kterou JetBrains provozuje společně s Googlem. Používání jazyka není zpoplatněné a nevyžaduje žádné licence, na rozdíl od některých komerčních nástrojů JetBrains. Verze jazyka mají definovanou politiku zpětné kompatibility, takže starší kód se s novým překladačem obvykle přeloží.
Zdroje
- Kotlin (programming language)(otevře se v novém okně)
- Develop Android apps with Kotlin(otevře se v novém okně)
- Kotlin(otevře se v novém okně)