Kotlin — a JetBrains statikusan típusos programozási nyelve, amely a JVM-en fut és 2017 óta hivatalosan támogatott a Google által Android-fejlesztéshez. A Kotlin teljes mértékben kompatibilis a Java-val, tömör szintaxissal és beépített null-biztonsággal rendelkezik. Kotlin Documentation — teljes útmutató a nyelvhez és a szabványos könyvtárhoz.
Főbb pontok
Kotlin — egy statikusan típusos programozási nyelv, amelyet a JetBrains (az IntelliJ IDEA fejlesztője) hozott létre és 2016-ban adott ki Apache 2.0 licenc alatt. A Kotlin JVM bájtkódra, JavaScriptre és natív kódra (Kotlin/Native-en keresztül) fordít. Fő alkalmazási területe az Android-fejlesztés, szerveralkalmazások és cross-platform projektek.
A Google a Google I/O 2017-en nyilvánította a Kotlin-t az Android-fejlesztés hivatalos nyelvévé. A Google adatai szerint (Android Developer Blog, 2026) az új projektek több mint 85%-a a Google Play-ben Kotlin-t használ. A nyelvet aktívan használják szerveroldali fejlesztésben (Spring Boot, Ktor) és multiplatform projektekben (Kotlin Multiplatform Mobile) is.
A Kotlin teljes mértékben kompatibilis a Java-val — Java-kód hívható Kotlinból és fordítva ugyanazon projekten belül. A build eszközök (Gradle, Maven) mindkét nyelvet támogatják, lehetővé téve a fokozatos migrációt Java-ról Kotlin-ra fejlesztési állásidő nélkül.
Fő okok: tömörség — a Kotlin átlagosan 40%-kal kevesebb kódsort igényel, mint a Java ugyanazon feladat megoldásához. Null-biztonság — a fordító tiltja a nullable típusok használatát ellenőrzés nélkül. Funkcionális lehetőségek — magasabb rendű függvények, lambdák, extension functions és korutinok kifejezőbbé és biztonságosabbá teszik a kódot.
Az alapvető Kotlin szintaxis a tömörséget az egyértelműséggel kombinálja. A változók deklarálása val (immutable) és var (mutable) segítségével történik. A fordító type inference-t használ, de a típus explicit megadása is támogatott. A függvények deklarálása a fun kulcsszóval történik.
package com.example.intro
// Konstansok és változók
val appName: String = "KotlinApp" // megváltoztathatatlan
var version = 1.0 // megváltoztatható, típus kikövetkeztetett
// Függvény expression body-val
fun sum(a: Int, b: Int) = a + b
// String templates
fun greet(name: String) = "Helló, $name! Verzió ${appName}_$version"
// Default and named arguments
fun createUser(
name: String,
age: Int = 18,
email: String? = null
)When-kifejezés helyettesíti a switch-t Java-ban és rugalmasabb: támogatja a típusellenőrzést, tartományokat, feltételeket és ágakat break nélkül. A fordító ellenőrzi a teljes lefedettséget enum és sealed-osztályok esetén. Smart casts automatikusan konvertálja a típusokat is-ellenőrzés után, kiküszöbölve az explicit cast-okat.
fun analyzeValue(value: Any) = when (value) {
is String -> "${value.length} hosszúságú karakterlánc" // smart cast
is Int -> "Egész szám: $value"
in 1..10 -> "Szám az 1-10 tartományban"
else -> "Ismeretlen típus"
}Null-biztonság — a Kotlin kulcsfontosságú tulajdonsága, amely NullPointerException-t szüntet meg fordítási szinten. Kotlinban a típusok alapértelmezés szerint nem lehetnek nullok. A null engedélyezéséhez adjon ?-t a típushoz: String?. A fordító minden nullable érték explicit ellenőrzését követeli meg.
// Nullable és non-null típusok
val nonNull: String = "Mindig non-null"
val nullable: String? = null // engedélyezett
// Safe call — csak akkor fut le, ha nem null
val length: Int? = nullable?.length
// Elvis operátor — alapértelmezett érték
val text: String = nullable ?: "Default text"
// Let — blokk végrehajtása non-null értékkel
nullable?.let { value ->
println("Érték: $value")
}Safe call operátor (?.) null-t ad vissza, ha az operátor előtti objektum null, ellenkező esetben meghívja a metódust/tulajdonságot. Elvis operátor (?:) alapértelmezett értéket biztosít, ha a bal oldal null. Not-null állítás (!!) NullPointerException-t dob, ha az érték null — csak akkor használja, ha 100%-ig biztos az érték meglétében.
Platform típusok (platform types) — Java-típusok a hívott Java kódból, amelyeket a Kotlin nem tud nullable vagy non-null értékként megjelölni. A típus String!-ként jelenik meg (felkiáltójellel). A fejlesztő maga felelős a null-biztonságért a Java kóddal való munka során.
Adatosztályok Kotlinban automatikusan generálják az equals(), hashCode(), toString(), copy() és componentN() metódusokat. Ez kiküszöböli a Java-modellek (POJO) boilerplate kódját és tisztábbá teszi a kódot. Egy data class deklarálása egy sort vesz igénybe a Java-beli 20-30 sor helyett.
data class User(
val id: Long,
val name: String,
val email: String,
val age: Int? = null
)
// Használat
val user = User(1, "Anna", "anna@example.com")
val updatedUser = user.copy(age = 25)
// Destrukció
val (id, name) = user
println("Felhasználó #$id: $name")Destrukció lehetővé teszi egy data class változókra bontását egyetlen sorban. Ez kényelmes párok, hármasok és más összetett értékek esetén. A destrukció támogatott adatosztályokhoz, szabványos gyűjteményekhez (List, Map) és bármely osztályhoz, amely rendelkezik operator fun componentN()-nel.
Extension functions — a Kotlin mechanizmusa új metódusok hozzáadására meglévő osztályokhoz öröklődés nélkül. A kiterjesztések statikus metódusokká fordulnak receiver-paraméterrel, így öröklődés nem szükséges és virtualitás nem támogatott.
// Extension function String-hez
fun String.isEmail(): Boolean {
return this.contains("@") && this.contains(".")
}
// Extension property
val String.isPhoneNumber: Boolean
get() = this.matches(Regex("^\\+?[\\d-]{10,15}$"))
// Generic extension gyűjteményekhez
fun List<Int>.sumOfEvens(): Int {
return this.filter { it % 2 == 0 }.sum()
}
// Használat
println("test@mail.com".isEmail()) // trueA kiterjesztéseket széles körben használják az Android SDK-ban és könyvtárakban. Például az Android KTX Activity extensions kiterjesztő függvények Activity, Fragment, View és más osztályokhoz. A kiterjesztések deklarálhatók top-level függvényként fájlban vagy osztály tagjaiként (member extensions).
Coroutines — aszinkron programozási mechanizmus Kotlinban, amely lehetővé teszi nem blokkoló kód írását szekvenciális stílusban. A korutin felfüggeszti a végrehajtást egy suspend-függvényen a szál blokkolása nélkül, és folytatja a munkát a művelet befejezése után. Ez alternatívája az RxJava callback-láncainak és az AsyncTask-nak.
import kotlinx.coroutines.*
// Suspend-függvény — felfüggeszthető
suspend fun fetchUserData(userId: Int): User {
// delay — suspend-függvény, nem blokkolja a szálat
delay(500)
return User(userId, "User $userId", "user@example.com")
}
// Indítás korutinban
fun loadData() {
CoroutineScope(Dispatchers.Main).launch {
val user = fetchUserData(1) // felfüggesztés itt
updateUI(user) // folytatás a fő szálon
}
}Dispatchers határozzák meg a korutin szálkészletét: Dispatchers.Main (UI-szál), Dispatchers.IO (hálózati/lemez műveletek), Dispatchers.Default (CPU-intenzív feladatok). Structured concurrency garantálja, hogy a korutin nem marad aktív a scope befejezése után — ez megakadályozza a memóriaszivárgást.
// Párhuzamos indítás async/await segítségével
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())
}A választás Kotlin és Java között egy új Android-projekthez alapvető architekturális döntés. A Kotlin modernebb szintaxist és beépített biztonsági mechanizmusokat kínál, a Java — szélesebb fejlesztői készletet és érett könyvtárakat.
| Jellemző | Kotlin | Java |
|---|---|---|
| Null-biztonság | Beépített (nullable/non-null) | Hiányzik (@Nullable annotációk) |
| Kód mennyisége | −40% Java-hoz képest | Boilerplate (getters/setters) |
| Adatosztályok | data class (egy sor) | POJO Lombok-kal vagy manuálisan |
| Aszinkronitás | Coroutines (suspend/await) | CompletableFuture, RxJava |
| Extension functions | Beépített | Csak utility osztályokon keresztül |
| Smart casts | is-ellenőrzés után | Explicit cast (Type) obj |
| Visszafelé kompatibilitás | 100% Java-val | — |
Teljesítmény tekintetében Kotlin és Java összehasonlítható — mindkettő JVM bájtkódra fordít. A Kotlin néha mikro-többletterhelést ad a korutinokhoz és inlining-hoz, de ez elhanyagolható a mobilalkalmazások számára. A Google és a JetBrains aktívan fektet a Kotlin-ba: Kotlin Multiplatform, Kotlin/Wasm és a K2 fordító teljesítményének javítása.
Gyakran Ismételt Kérdések
A Kotlin 40%-kal rövidebb a Java-nál — kevesebb boilerplate. A Kotlin null-biztonságot, adatosztályokat, extension functions, korutinokat, smart casts-eket, when-kifejezéseket ad hozzá. Teljes kompatibilitás a Java-val: mindkét nyelv a JVM-en fut és konfliktus nélkül használható ugyanabban a projektben.
A típusok alapértelmezés szerint non-null értékűek. Nullable-hez használja ?: String?. A fordító tiltja a nullable érték közvetlen elérését. Safe call (?.) null-t ad vissza null receiver esetén. Elvis operátor (?:) alapértelmezett értéket állít be. !! — kényszerített kivétel lehetséges kivétellel.
A korutinok — könnyűsúlyú szálak, amelyek lehetővé teszik aszinkron kód szekvenciális írását. A suspend-függvények a szál blokkolása nélkül felfüggesztenek. A launch és async elindítja a korutinokat a CoroutineScope-ban. Dispatchers.IO hálózati kérésekhez, Dispatchers.Main UI-frissítésekhez.
A data class automatikusan generálja az equals(), hashCode(), toString(), copy() és componentN() metódusokat. Példa: data class User(val name: String, val age: Int). Destrukció a val (name, age) = user segítségével. Analóg a Java 14+ record-dal, de a copy() metódussal kiegészítve.
Az extension functions metódusokat adnak meglévő osztályokhoz: fun String.isEmail(): Boolean. A fordító statikus hívásokkal helyettesíti őket receiver-paraméterrel. Öröklődés nem szükséges. A kiterjesztéseket széles körben használják az Android KTX-ben: view.showToast(), activity.viewModels().
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is