Kotlin’in Getirdiği Yenilikler

Zafer Ayan
5 min readDec 27, 2018

--

Önceki yazımızda Java’nın eksiklerini Kotlin nasıl gidermeye çalıştı bunun üzerine değinmiştik. Bu yazımızda ise Kotlin’in getirdiği yeniliklere değineceğiz.

Data Class

Kotlin’de yer alan belki de en güzel özelliklerden biri data class’larıdır. Java’da oluşturulan constructor, get(), set(), toString() metodları ile dolan sınıfın aksine Kotlin’de tek bir satırda daha sade bir şekilde model sınıfları oluşturulabilir:

Kotlin’de data class’ı başında data keyword’ü ile oluşturulur. User’dan sonra gelen parantez içerisindeki ifadede constructor tanımı yer alır. Üstteki kodu Android Studio içerisindeki üst menüden Tools > Kotlin > Show Kotlin Bytecode ‘u seçtiğimizde çıkan Kotlin Bytecode penceresinde Decompile butonuna bastığınızda aşağıdaki gibi Java halinin oluştuğunu göreceksiniz:

Java karşılığında oluşan kodda aşağıdakiler otomatik olarak oluşturulmuştur:

  • getter/setter fonksiyonları.
  • constructor
  • copy() metodu
  • toString()
  • hashCode()
  • equals()
  • Destructuring için component1/2 metodları

Java’da yaklaşık 100 satırlık bir iş Kotlin’de data sınıfları ile tek satırda halledilmiş olur.

Top-level (package level) sınıflar ve fonksiyonlar

Java’da fonksiyonların bir sınıf içerisinde yer alması gerektiğini biliyoruz. Örneğin basit bir main fonksiyonu aşağıdaki gibi yazılması gerekiyor:

Kotlin’de ise fonksiyonlar, değişkenler, sınıflar, nesneler ve interface’ler top-level halde oluşturulabilirler. Bir fonksiyonun top-level olması demek, paket içerisinde direkt olarak tanımlanması anlamına gelir. Örneğin aşağıdaki kod Kotlin için geçerlidir:

str değişkeni top-level olarak tanımlanmıştır ve main metodu içerisinde direkt olarak kullanılmıştır. Diğer bir kısım ise public static void mainyerine fun mainyazarak daha az kodla aynı işin yapılması sağlanmıştır.

var ve val kullanımı

C# ve JavaScript’teki var keyword’ünün Kotlin’e gelmesi ile tipi açık olarak tanımlamadan değişken tanımının yapılması sağlanmıştır. 2 çeşit değişken tanımlama keyword’ü kullanılır:

  • var: Tekrar değer atanabilir değişkenler için var keyword’ü kullanılır.
  • val: Bir kere değişken atanır, daha sonrasında ise read-only işlemler yürütülür.

Not: Kotlin’de val ile const birbirine benzer fakat const değişkenler derleme zamanında değer atanır, val değişkenlere ise çalışma zamanında değer atanır.

Bu arada const ifadesi sadece val keyword’ü ile kullanılabilir, var ile kullanıldığında hata verecektir.

.equals() yerine == kullanımı

Java’da == operatörünün, iki nesne değişkeninin RAM’de aynı yeri ifade etmesi ile ilgili kontrolün gerçekleştirdiğini biliyoruz. İki nesnenin değişken değerleri aynı olduğu halde == operatörü false sonucu veriyor. Bu nedenle nesnelerin eşitliği için equals() metodunu override ederek kullanıyoruz.

Kotlin’de == operatörü iki adet data class’ın değerlerinin eşitliği için kullanılabilir. Örnek olarak aşağıdaki kodun çıktısı eşittir olacaktır:

Not: Kotlin’de sadece data class’ları için bu durum geçerlidir. Eğer normal bir class yazdıysanız eşit değildir sonucu verecektir. Örnek:

Data class’larında equals metodu otomatik olarak oluşturulduğu için eşitlik sağlanmıştır. Normal class’larda == operatörü kullanılmak istenirse Java’da olduğu gibi equals() metodu override edilmelidir.

get/set ön eklerinin kullanılmaması

Java’dan aşina olduğumuz get() set() gibi fonksiyonların kullanımı yerine Kotlin’de sadece değişkenin adı kullanılır. Örneğin insan.getAdi() yerine insan.adi şeklinde kullanım mevcuttur.

String şablonları

Kotlin’de aynı C#’da olduğu gibi String şablonları (string templates) yer alır. Örneğin:

Çok satırlı string ifadeler oluşturulurken ise üçlü çift tırnak ””” (triple quotes) kullanılabilir.

Boşluk karakterlerinin silinmesi için pipe operatörü | ile birlikte trimMargin fonksiyonu kullanılabilir:

Varsayılan parametreler (default parameters)

C# gibi dillerde bulunan varsayılan değere sahip fonksiyon oluşturma Java’da mevcut değildir. Bunun yerine varsayılan değerler fonksiyon içerisinde atanır. Kotlin’de ise varsayılan değerli parametreler bulunmaktadır. Örneğin:

Tek ifadeli fonksiyonlar

Kotlin’de fonksiyonlarda süslü parantezler iptal edilip sadece sonucun = tarafından atanması ile single expression functions (tek ifadeli fonksiyonlar) kullanılabilir. Örnek:

Tip kontrolü ve dönüşümleri (is ve as)

Kotlin’de bir değişkenin hangi tipte olduğunu kontrol etmek için is keyword’ü kullanılır:

Smart casts (akıllı dönüşümler)

is ile kontrol edilen ifadelerde, durum ifadesi içerisinde tip dönüşümü derleyici tarafından otomatik olarak yapılır. Örnek:

Unsafe casting (tehlikeli dönüşümler)

Tip dönüşüm işlemi as keyword’ü ile yapılabilir. Eğer değişken, ilgili tipe dönüşemiyorsa ClassCastException hatası alınır. Bu yüzden unsafe’tir:

val x: String = y as String

Safe (nullable) casting

Tip dönüşüm işleminin gerçekleşmediği durumlarda hata alınmadan ilgili değişkene null atanması sağlanır. as? operatörü kullanılır:

val x: String = y as? String

switch-case yapısı

Çoklu if ifadelerinin basitleştirilmesi için üretilen switch-case yapısının Kotlin’deki karşılığı when keyword’ü olarak karşımıza çıkıyor. Aşağıda basit bir örnek bulunmaktadır:

Java ve C# gibi dillerin aksine her case için ayrı ayrı breakifadesini koymak gerekmez. Hiçbir koşula uymayan durum için default yerine elsekullanılabilir. Birden fazla koşul için aynı işlemin yapılması da sağlanabilir. Örnek:

when ifadesi parametre almadan da çalıştırılabilir. Örnek:

Sabit değerler vermek yerine belirli aralıklar da verilebilir. Örnek:

return ifadesi kullanılmadan = operatörü ile değer döndürme sağlanabilir. Ayrıca when koşulunda tip kontrolü ve smart casting de yapılabilir:

Extension functions (Genişletme fonksiyonları)

C#’da olduğu gibi Kotlin’de de extension fonksiyonlar yazılabilir. Extension’lar bir sınıfı inherit etmeden yeni bir özellik kazandırmak amacıyla yapılır. Örneğin aşağıdaki şekilde int tipine yüzde hesaplama fonksiyonu eklenebilir:

Extension properties

Kotlin’de extension function’lara benzer olarak extension property desteği de vardır. Aşağıdaki şekilde 100'ün 100ºC ifadesindeki String haline dönüşümü yapılabilir:

Predicates

Predicate’leri doğrulama ifadeleri olarak çevirsek yanlış olmaz. Çünkü bu ifadelerde tüm bir liste içerisinde bir ifadenin doğruluğunun testi yapılıp o şekilde sonuç döndürülütyor. Kotlin’de predicate’ler aşağıdaki gibi oluşturulabilir:

Delegation

Delegation’ın Türkçe karşılığı olarak yetki atama diyebiliriz. Delegation işleminde, bir nesne ilgili çağrıyı alır ve diğer bir nesneye aktarır.

Lazy fonksiyonu

lazy() fonksiyonu lambda ifadesi alır ve geriye Lazy<T> tipinde bir değer döndürür. Lazy<T> değeri, lazy özelliğinin çalıştırılması için bir delegate görevi üstlenir. Lazy özelliğinde ilgili değeri getiren get() çalışıtırılana dek lambda ifadesi çalıştırılmadan kalır (bu nedenle tembeldir (lazy)). İlgili değer başka bir fonksiyonda kullanılmak üzere çalıştırıldığı zaman lambda ifadesi de çalıştırılır ve sonucu saklanır. Sonraki get çağrımlarında saklı sonuç değeri geri döndürülür. Örnek:

TODO fonksiyonu

Java’da yapmayı ertelediğimiz işlerde yorum satırı oluşturarak TODO ifadesi bırakıyorduk. Örneğin:

// TODO: daha sonra yapılacak

Kotlin’de ise bu yorum satırı yerine bir TODO() fonksiyonu oluşturulmuş. TODO fonksiyonunu çağrıldığında bir NotImplementedError exception’ı fırlatır:

Sonuç olarak

Kotlin’in yeni özellikleri gerçekten heyecan verici. Özellikle Kotlin’e geçtikten sonra tekrar Java’ya dönmek hayal kırıklığına sebep olabiliyor. Kotlin’de kolayca yapabildiğiniz birçok şey için fazladan kod yazmak durumunda kalıyorsunuz. Halihazırda yazmış olduğunuz Java kodunu Kotlin’e dönüştürmek Android Studio sayesinde çok kolay. Yani stackoverflow gibi sitelerden kopyala yapıştır yaptığınızda otomatik olarak convert edebiliyorsunuz.

Kopyaladığınız bir Java kodu bir .kt uzantılı dosyaya yapıştırdığınızda, Android Studio size Kotlin’e dönüşüm yapmak istediğinizi sorar. Yes’i seçtiğinizde de Kotlin koduna dönüştürülmüş olur.

Eğer bu yazı ile ilgili soru ve düşünceleriniz varsa aşağıda yorum kısmından yazabilirsiniz. Teşekkür etmeniz için alkış butonuna basmanız yeterli. Sonraki yazımda bir Kotlin projesi ve içeriği üzerine değineceğim. Görüşmek üzere 👋

--

--

Responses (2)