Perché Kotlin è diventato il linguaggio ufficiale per Android

Illustrazione dello sviluppo di Kotlin e Android

Molto prima di Kotlin, lo sviluppo di Android era sinonimo di Java. Sebbene Java sia uno dei linguaggi più utilizzati al mondo, l’ecosistema Android era limitato. A causa di controversie legali e requisiti di compatibilità, Android è rimasto bloccato all’uso di versioni obsolete (Java 6 e 7) per molto tempo. Ciò ha comportato codice boilerplate prolisso, cicli di sviluppo lenti e il famigerato “errore da un miliardo di dollari”: la NullPointerException.

Nel 2017, Google ha scosso il mondo degli sviluppatori annunciando il supporto ufficiale per Kotlin come linguaggio di prima classe per Android. Entro il 2019, Google ha dichiarato lo sviluppo di Android “Kotlin-First”. Oggi, oltre il 95% delle prime 1.000 app Android è scritto in Kotlin.

Ecco perché Kotlin ha completamente sostituito Java ed è diventato il re indiscusso dello sviluppo Android.


1. Sicurezza contro i valori nulli a costo zero

In Java, qualsiasi riferimento a un oggetto può essere null. Se tenti di chiamare un metodo su un riferimento nullo, la tua app si arresta in modo anomalo con una NullPointerException (NPE). Questa è la causa principale dei crash nelle app Android.

Kotlin risolve questo problema incorporando la nullabilità direttamente nel suo sistema di tipi.

  • Tipi non nullable: Per impostazione predefinita, le variabili non possono contenere valori nulli (val name: String = "Ghaznix"). Il tentativo di assegnare null qui causa un errore in fase di compilazione.
  • Tipi nullable: Se una variabile può essere nulla, deve essere dichiarata esplicitamente con un punto interrogativo (var name: String? = null).
  • Chiamate sicure: È possibile accedere in sicurezza alle proprietà utilizzando l’operatore di chiamata sicura ?. (ad es. name?.length), qui restituisce null anziché arrestarsi in modo anomalo se la variabile è nulla.

2. Interoperabilità al 100% con Java

Uno dei maggiori ostacoli all’adozione di un nuovo linguaggio di programmazione è la riscrittura del codice esistente. JetBrains ha progettato Kotlin tenendo a mente l’interoperabilità al 100% con Java.

È possibile chiamare classi Java da Kotlin e classi Kotlin da Java senza problemi. Ciò ha consentito agli sviluppatori di adottare Kotlin in modo incrementale. Potevano mantenere intatto il codice Java legacy esistente e scrivere tutte le nuove funzionalità in Kotlin, mescolando entrambi i linguaggi nello stesso progetto senza problemi di compilazione.


3. Riduzione drastica del codice boilerplate

Java è notoriamente prolisso. La configurazione di semplici modelli di dati richiede la scrittura di campi privati, costruttori, getter, setter, metodi toString(), equals() e hashCode().

Kotlin elimina completamente questo codice boilerplate. Confrontiamo la definizione di un semplice modello di dati utente:

Implementazione in Java:

public class User {
    private String name;
    private String email;

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) && Objects.equals(email, user.email);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, email);
    }

    @Override
    public String toString() {
        return "User{name='" + name + "', email='" + email + "'}";
    }
}

Implementazione in Kotlin:

data class User(var name: String, var email: String)

Utilizzando il modificatore data, Kotlin genera automaticamente getter, setter, equals(), hashCode() e toString() dietro le quinte. Una classe Java di 35 righe viene ridotta a una singola riga in Kotlin.


4. Coroutine per attività asincrone

Le app mobili devono eseguire richieste di rete, operazioni di database e I/O di file su thread in background per evitare il congelamento dell’interfaccia utente.

In Java, la gestione dei thread richiedeva l’uso di librerie complesse come RxJava o classi AsyncTask obsolete, che spesso portavano al “callback hell” (l’inferno delle callback).

Kotlin ha introdotto le Coroutine, un framework di concorrenza leggero. Le coroutine consentono agli sviluppatori di scrivere codice asincrono e non bloccante che ha l’aspetto e il comportamento di un semplice codice sequenziale:

// Chiamata di rete asincrona utilizzando le coroutine Kotlin
viewModelScope.launch {
    try {
        val user = apiService.getUserDetails(userId) // Sospende l'esecuzione senza bloccare il thread principale
        updateUI(user)
    } catch (e: Exception) {
        showError(e)
    }
}

5. Funzioni di estensione (Extension Functions)

In Java, se desideri estendere le funzionalità di una classe (ad esempio, aggiungendo un metodo di formattazione a String), devi ereditare da essa o scrivere una classe di utilità (como StringUtils).

Kotlin introduce le Funzioni di estensione, che consentono agli sviluppatori di aggiungere nuove funzioni a classi esistenti senza modificarne il codice sorgente o ereditare da esse:

// Estensione della classe String per verificare la validità delle e-mail
fun String.isValidEmail(): Boolean {
    return android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
}

// Utilizzo:
val email = "info@ghaznix.com"
if (email.isValidEmail()) {
    // Procedi con il login
}

Conclusione: un ecosistema incentrato sullo sviluppatore

L’ascesa di Kotlin non è stata guidata solo dall’approvazione di Google; è stata spinta dalla soddisfazione degli sviluppatori. Secondo i sondaggi sugli sviluppatori di Stack Overflow, Kotlin si posiziona costantemente come uno dei linguaggi di programmazione più amati.

Mettendo al primo posto la felicità degli sviluppatori, riducendo il codice ripetitivo ed eliminando i bug di sicurezza relativi ai valori nulli, Kotlin non solo ha reso lo sviluppo Android più veloce, ma ha anche elevato la qualità delle applicazioni mobili in tutto il mondo.


Esplora altri approfondimenti per sviluppatori sul blog di Ghaznix →