Kotlin για Android: βασικά σύνταξης και δυνατότητες

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-10 Χρόνος ανάγνωσης: 8 λεπ

Kotlin — μια στατικά τυποποιημένη γλώσσα προγραμματισμού από τη JetBrains, που λειτουργεί σε JVM και υποστηρίζεται επίσημα από την Google για ανάπτυξη Android από το 2017. Το Kotlin είναι πλήρως συμβατό με Java, έχει συνοπτική σύνταξη και ενσωματωμένη ασφάλεια null. Kotlin Documentation — πλήρης οδηγός για τη γλώσσα και την τυπική βιβλιοθήκη.

Κύρια σημεία

  • Kotlin — μια στατικά τυποποιημένη γλώσσα JVM από τη JetBrains με συνοπτική σύνταξη και ασφάλεια null
  • Null safety — ο μεταγλωττιστής διακρίνει τους τύπους nullable (String?) και non-null (String), εξαλείφοντας το NullPointerException
  • Data classes — αυτόματη δημιουργία equals, hashCode, toString, copy και componentN
  • Extension functions — προσθήκη μεθόδων σε υπάρχουσες κλάσεις χωρίς κληρονομικότητα μέσω στατικών κλήσεων
  • Coroutines — ασύγχρονος προγραμματισμός σε σειριακό στυλ μέσω συναρτήσεων suspend χωρίς αποκλεισμό νημάτων

Τι είναι το Kotlin;

Kotlin — μια στατικά τυποποιημένη γλώσσα προγραμματισμού που δημιουργήθηκε από τη JetBrains (δημιουργό του IntelliJ IDEA) και κυκλοφόρησε το 2016 με άδεια Apache 2.0. Το Kotlin μεταγλωττίζεται σε bytecode 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 είναι πιο δημοφιλές από τη Java για Android

Κύριοι λόγοι: συνοπτικότητα — το Kotlin απαιτεί κατά μέσο όρο 40% λιγότερες γραμμές κώδικα από τη Java για την ίδια εργασία. Ασφάλεια null — ο μεταγλωττιστής απαγορεύει τη χρήση τύπων nullable χωρίς έλεγχο. Λειτουργικές δυνατότητες — συναρτήσεις ανώτερης τάξης, λάμδα, extension functions και coroutines κάνουν τον κώδικα πιο εκφραστικό και ασφαλή.

Βασικά σύνταξης

Η βασική σύνταξη Kotlin συνδυάζει τη συνοπτικότητα με τη σαφήνεια. Οι μεταβλητές δηλώνονται μέσω val (αμετάβλητη) και var (μεταβλητή). Ο μεταγλωττιστής χρησιμοποιεί type inference, αλλά υποστηρίζεται και η ρητή δήλωση τύπου. Οι συναρτήσεις δηλώνονται με τη λέξη-κλειδί fun.

kotlin
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, εξαλείφοντας ρητές μετατροπές.

kotlin
fun analyzeValue(value: Any) = when (value) {
    is String -> "Συμβολοσειρά μήκους ${value.length}"  // smart cast
    is Int -> "Ακέραιος αριθμός: $value"
    in 1..10 -> "Αριθμός στο εύρος 1-10"
    else -> "Άγνωστος τύπος"
}

Ασφάλεια null και τελεστές elvis

Ασφάλεια null — βασικό χαρακτηριστικό του Kotlin που εξαλείφει το NullPointerException σε επίπεδο μεταγλώττισης. Στο Kotlin, οι τύποι από προεπιλογή δεν μπορούν να είναι null. Για να επιτρέψετε null, προσθέστε ? στον τύπο: String?. Ο μεταγλωττιστής απαιτεί ρητό έλεγχο κάθε τιμής nullable.

kotlin
// Τύποι 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-κλάσεις και αποδόμηση

Data-κλάσεις στο Kotlin δημιουργούν αυτόματα equals(), hashCode(), toString(), copy() και componentN(). Αυτό εξαλείφει το boilerplate των μοντέλων Java (POJO) και καθαρίζει τον κώδικα. Η δήλωση μιας data class καταλαμβάνει μία γραμμή αντί για 20-30 στη Java.

kotlin
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, επομένως η κληρονομικότητα δεν απαιτείται και η εικονικότητα δεν υποστηρίζεται.

kotlin
// 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 για ασύγχρονο προγραμματισμό

Coroutines — μηχανισμός ασύγχρονου προγραμματισμού στο Kotlin που επιτρέπει τη σύνταξη μη αποκλειστικού κώδικα σε σειριακό στυλ. Ένα coroutine αναστέλλει την εκτέλεση σε μια συνάρτηση suspend χωρίς αποκλεισμό του νήματος και συνεχίζει την εργασία μετά την ολοκλήρωση της λειτουργίας. Αυτό είναι εναλλακτική των αλυσίδων callback RxJava και AsyncTask.

kotlin
import kotlinx.coroutines.*

// Suspend-συνάρτηση — μπορεί να ανασταλεί
suspend fun fetchUserData(userId: Int): User {
    // delay — suspend-συνάρτηση, δεν αποκλείει νήμα
    delay(500)
    return User(userId, "User $userId", "user@example.com")
}

// Εκκίνηση σε coroutine
fun loadData() {
    CoroutineScope(Dispatchers.Main).launch {
        val user = fetchUserData(1)  // αναστολή εδώ
        updateUI(user)  // συνέχεια στο κύριο νήμα
    }
}

Dispatchers καθορίζουν την ομάδα νημάτων για το coroutine: Dispatchers.Main (νήμα UI), Dispatchers.IO (λειτουργίες δικτύου/δίσκου), Dispatchers.Default (εργασίες έντασης CPU). Structured concurrency εγγυάται ότι το coroutine δεν παραμένει ενεργό μετά το τέλος του scope — αυτό αποτρέπει διαρροές μνήμης.

kotlin
// Παράλληλη εκκίνηση μέσω 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: σύγκριση

Η επιλογή μεταξύ Kotlin και Java για ένα νέο έργο Android — θεμελιώδης αρχιτεκτονική απόφαση. Το Kotlin προσφέρει πιο σύγχρονη σύνταξη και ενσωματωμένους μηχανισμούς ασφαλείας, η Java — ευρύτερη δεξαμενή προγραμματιστών και ώριμες βιβλιοθήκες.

ΧαρακτηριστικόKotlinJava
Ασφάλεια nullΕνσωματωμένη (nullable/non-null)Απουσιάζει (σημειώσεις @Nullable)
Όγκος κώδικα−40% σε σχέση με JavaBoilerplate (getters/setters)
Data-κλάσειςdata class (μία γραμμή)POJO με Lombok ή χειροκίνητα
ΑσυγχρονισμόςCoroutines (suspend/await)CompletableFuture, RxJava
Extension functionsΕνσωματωμένεςΜόνο μέσω utility κλάσεων
Smart castsΜετά από έλεγχο isΡητή μετατροπή (Type) obj
Συμβατότητα προς τα πίσω100% με Java

Απόδοση Kotlin και Java είναι συγκρίσιμες — και οι δύο μεταγλωττίζονται σε bytecode JVM. Το Kotlin μερικές φορές προσθέτει μικρο-επιβάρυνση στα coroutines και στο inlining, αλλά αυτό είναι αμελητέο για εφαρμογές κινητών. Η Google και η JetBrains επενδύουν ενεργά στο Kotlin: Kotlin Multiplatform, Kotlin/Wasm και βελτίωση απόδοσης του μεταγλωττιστή K2.

Συχνές Ερωτήσεις

Σε τι διαφέρει το Kotlin από τη Java;

Το Kotlin είναι 40% συντομότερο από τη Java — λιγότερο boilerplate. Το Kotlin προσθέτει ασφάλεια null, data-κλάσεις, extension functions, coroutines, smart casts, when-εκφράσεις. Πλήρης συμβατότητα με Java: και οι δύο γλώσσες λειτουργούν σε JVM και μπορούν να χρησιμοποιηθούν στο ίδιο έργο χωρίς συγκρούσεις.

Πώς λειτουργεί η ασφάλεια null στο Kotlin;

Οι τύποι από προεπιλογή είναι non-null. Για nullable χρησιμοποιήστε ?: String?. Ο μεταγλωττιστής απαγορεύει την άμεση πρόσβαση σε τιμή nullable. Το Safe call (?.) επιστρέφει null σε null receiver. Ο τελεστής Elvis (?:) ορίζει προεπιλεγμένη τιμή. !! — αναγκαστική εξαγωγή με πιθανή εξαίρεση.

Τι είναι τα coroutines στο Kotlin;

Coroutines — ελαφριά νήματα που επιτρέπουν τη σύνταξη ασύγχρονου κώδικα σειριακά. Οι συναρτήσεις suspend αναστέλλονται χωρίς αποκλεισμό του νήματος. Τα launch και async εκκινούν coroutines στο CoroutineScope. Dispatchers.IO για αιτήματα δικτύου, Dispatchers.Main για ενημερώσεις UI.

Τι είναι οι data-κλάσεις στο Kotlin;

Η 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);

Οι extension functions προσθέτουν μεθόδους σε υπάρχουσες κλάσεις: fun String.isEmail(): Boolean. Ο μεταγλωττιστής τις αντικαθιστά με στατικές κλήσεις με παράμετρο receiver. Η κληρονομικότητα δεν απαιτείται. Οι επεκτάσεις χρησιμοποιούνται ευρέως στο Android KTX: view.showToast(), activity.viewModels().

Σύνοψη

  • Kotlin — στατικά τυποποιημένη γλώσσα JVM από τη JetBrains, επίσημη γλώσσα Android από το 2017
  • Null safety — τύποι nullable/non-null, safe call (?.), elvis (??), let-μπλοκ για ασφαλή εργασία με nullable
  • Data classes — αυτόματη δημιουργία equals, hashCode, toString, copy και αποδόμηση
  • Extension functions — προσθήκη μεθόδων σε οποιεσδήποτε κλάσεις χωρίς κληρονομικότητα, μεταγλώττιση σε στατικές κλήσεις
  • Coroutines — ασύγχρονος κώδικας σε σειριακό στυλ με συναρτήσεις suspend, launch/async και Dispatchers
  • Σύγκριση με Java — −40% κώδικα, ασφάλεια null, smart casts, when-εκφράσεις και 100% συμβατότητα με Java
  • Kotlin Multiplatform — το Kotlin χρησιμοποιείται όχι μόνο για Android, αλλά και για iOS (KMM) και διακομιστές (Ktor, Spring)

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης