Kotlin Neden Android'in Resmi Dili Oldu?
Kotlin’den çok önce, Android geliştirme Java ile eş anlamlıydı. Java dünyanın en yaygın kullanılan dillerinden biri olsa da, Android ekosistemi kısıtlıydı. Lisans anlaşmazlıkları ve uyumluluk gereksinimleri nedeniyle Android uzun süre eski sürümlere (Java 6 ve 7) sıkışıp kalmıştı. Bu durum, uzun ve tekrarlayan şablon (boilerplate) kodlara, yavaş geliştirme süreçlerine ve meşhur “milyar dolarlık hata” olan NullPointerException hatasına yol açıyordu.
2017’de Google, Kotlin’i Android için birinci sınıf bir dil olarak resmi düzeyde destekleyeceğini duyurarak yazılım dünyasını şaşırttı. 2019’da ise Android geliştirmeyi “Kotlin Öncelikli” (Kotlin-First) ilan etti. Günümüzde en popüler 1.000 Android uygulamasının %95’inden fazlası Kotlin ile yazılmıştır.
İşte Kotlin’in Java’nın yerini tamamen alarak Android geliştirmenin tartışmasız lideri olmasının nedenleri.
1. Sıfır Maliyetli Null Güvenliği (Null Safety)
Java’da herhangi bir nesne referansı null (boş) olabilir. Null bir referans üzerinde metot çağırmaya çalışırsanız, uygulamanız NullPointerException (NPE) hatası ile çöker. Bu, Android uygulamalarındaki çökmelerin en büyük nedenidir.
Kotlin, null olabilirlik durumunu doğrudan tip sistemine yerleştirerek bu sorunu çözer.
- Null Olamaz Tipler: Varsayılan olarak değişkenler null değerler alamaz (
val name: String = "Ghaznix"). Buraya null atamaya çalışmak derleme zamanı hatasına neden olur. - Null Olabilir Tipler: Bir değişken null olabiliyorsa, soru işareti ile açıkça bildirilmelidir (
var name: String? = null). - Güvenli Çağrılar: Güvenli çağrı operatörü
?.kullanarak özelliklere güvenle erişebilirsiniz (name?.lengthgibi). Değişken null ise uygulama çökmek yerine null döndürür.
2. Java ile %100 Uyumlu Çalışma (Interoperability)
Yeni bir programlama diline geçişteki en büyük engellerden biri mevcut kodları yeniden yazmaktır. JetBrains, Kotlin’i Java ile %100 uyumluluk hedefiyle tasarlamıştır.
Kotlin’den Java sınıflarını ve Java’dan Kotlin sınıflarını sorunsuz bir şekilde çağırabilirsiniz. Bu, geliştiricilerin Kotlin’i aşamalı olarak benimsemesini sağladı. Mevcut eski Java kodlarına hiç dokunmadan tüm yeni özellikleri Kotlin ile yazabildiler ve her iki dili aynı projede derleme sorunu yaşamadan bir arada kullanabildiler.
3. Şablon Kodların Ciddi Oranda Azalması
Java, uzun ve detaylı yazım tarzıyla bilinir. Basit veri modelleri oluşturmak bile private alanlar, yapıcı metotlar (constructors), getter ve setter metotları ile toString(), equals() ve hashCode() metotlarını yazmayı gerektirir.
Kotlin bu şablon kodları tamamen ortadan kaldırır. Basit bir kullanıcı veri modelini tanımlamayı karşılaştıralım:
Java uygulaması:
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 + "'}";
}
}
Kotlin uygulaması:
data class User(var name: String, var email: String)
data niteleyicisini kullanarak Kotlin, arka planda otomatik olarak getter, setter, equals(), hashCode() ve toString() metotlarını oluşturur. Java’daki 35 satırlık sınıf, Kotlin’de tek bir satıra iner.
4. Asenkron Görevler için Coroutines (Eş Yordamlar)
Mobil uygulamalar, kullanıcı arayüzünün donmasını önlemek için arka plan iş parçacıklarında ağ istekleri, veritabanı işlemleri ve dosya giriş/çıkış işlemlerini yapmalıdır.
Java’da iş parçacığı yönetimi, RxJava gibi karmaşık kütüphaneleri veya artık kullanımdan kaldırılmış olan AsyncTask sınıflarını kullanmayı gerektiriyordu; bu da genellikle “geri çağırım cehennemine” (callback hell) yol açıyordu.
Kotlin, hafif bir eşzamanlılık çerçevesi olan Coroutines altyapısını sundu. Coroutines, geliştiricilerin basit ardışık kodlar yazar gibi asenkron ve bloklamayan kodlar yazmasını sağlar:
// Kotlin Coroutines kullanarak asenkron ağ çağrısı
viewModelScope.launch {
try {
val user = apiService.getUserDetails(userId) // Ana iş parçacığını engellemeden yürütmeyi askıya alır
updateUI(user)
} catch (e: Exception) {
showError(e)
}
}
5. Genişletme Fonksiyonları (Extension Functions)
Java’da bir sınıfın işlevselliğini genişletmek istiyorsanız (örneğin String sınıfına biçimlendirme yöntemi eklemek), ya o sınıftan türetme yapmanız ya da bir yardımcı sınıf (örneğin StringUtils) yazmanız gerekirdi.
Kotlin, geliştiricilerin mevcut sınıfların kaynak kodunu değiştirmeden veya onlardan miras almadan yeni fonksiyonlar eklemesini sağlayan Genişletme Fonksiyonlarını sunar:
// E-postaların geçerliliğini kontrol etmek için String sınıfını genişletme
fun String.isValidEmail(): Boolean {
return android.util.Patterns.EMAIL_ADDRESS.matcher(this).matches()
}
// Kullanım:
val email = "info@ghaznix.com"
if (email.isValidEmail()) {
// Giriş işlemine devam et
}
Sonuç: Önce Geliştirici Diyen Bir Ekosistem
Kotlin’in yükselişi sadece Google’ın desteğiyle olmadı; geliştiricilerin duyduğu memnuniyetle beslendi. Stack Overflow anketlerine göre Kotlin, en çok sevilen programlama dillerinden biri olarak sürekli üst sıralarda yer almaktadır.
Geliştirici mutluluğunu önceliklendirerek, şablon kodları azaltarak ve null güvenliği hatalarını ortadan kaldırarak Kotlin, sadece Android geliştirmeyi hızlandırmakla kalmadı, aynı zamanda dünya çapındaki mobil uygulamaların kalitesini de yükseltti.
Ghaznix Blog’unda daha fazla geliştirici analizini keşfedin →