Kotlin nedir? Java alternatifi açıklandı

Kotlin, nesne yönelimli ve işlevsel programlama özelliklerini birleştiren, başlangıçta JVM (Java Sanal Makinesi) ve Android için tasarlanmış, genel amaçlı, ücretsiz, açık kaynaklı, statik olarak yazılmış "pragmatik" bir programlama dilidir. Birlikte çalışabilirlik, güvenlik, netlik ve takım desteğine odaklanmıştır. JavaScript ES5.1'i ve bir dizi işlemci için yerel kodu (LLVM kullanan) hedefleyen Kotlin sürümleri de üretim aşamasındadır.

Kotlin, 2010 yılında IntelliJ IDEA'nın arkasındaki şirket olan JetBrains'te kuruldu ve 2012'den beri açık kaynak. Kotlin ekibinin şu anda JetBrains'ten 90'dan fazla tam zamanlı üyesi var ve GitHub'daki Kotlin projesinin 300'den fazla katılımcısı var. JetBrains, amiral gemisi IntelliJ IDEA da dahil olmak üzere birçok ürününde Kotlin kullanıyor.

Daha özlü bir Java dili olarak Kotlin

İlk bakışta Kotlin, Java'nın daha özlü ve akıcı bir versiyonu gibi görünüyor. Java kod örneğini (solda) otomatik olarak Kotlin'e dönüştürdüğüm yukarıdaki ekran görüntüsünü düşünün. Java değişkenlerinin somutlaştırılmasındaki akılsız tekrarın ortadan kalktığına dikkat edin. Java deyimi

StringBuilder sb = new StringBuilder ();

Kotlin'de oluyor

val sb = StringBuilder ()

İşlevlerin funanahtar sözcükle tanımlandığını ve yeni satırlar olduğunda noktalı virgüllerin artık isteğe bağlı olduğunu görebilirsiniz. valAnahtar kelime salt okunur özelliği veya yerel değişkeni bildirir. Benzer şekilde, varanahtar kelime de değiştirilebilir bir özellik veya yerel değişken bildirir.

Yine de Kotlin güçlü bir şekilde yazılmıştır. valVe vartip varılabilir zaman anahtar kelimeler yalnızca kullanılabilir. Aksi takdirde türü bildirmeniz gerekir. Tip çıkarımı, Kotlin'in her sürümüyle birlikte gelişiyor gibi görünüyor.

Her iki bölmenin üst kısmına yakın fonksiyon bildirimine bir göz atın. Java'daki dönüş türü prototipten önce gelir, ancak Kotlin'de Pascal'da olduğu gibi iki nokta üst üste işaretiyle ayrılmış prototipin yerine geçer.

Bu örnekten tam olarak açık değildir, ancak Kotlin, Java'nın işlevlerin sınıf üyeleri olması gerekliliğini gevşetmiştir. Kotlin'de işlevler, bir dosyada en üst düzeyde, yerel olarak diğer işlevlerin içinde, bir sınıf veya nesne içinde üye işlev olarak ve bir uzantı işlevi olarak bildirilebilir. Uzantı işlevleri, bir sınıfı, sınıftan miras almak veya Dekoratör gibi herhangi bir tasarım modelini kullanmak zorunda kalmadan yeni işlevsellikle genişletmek için C # benzeri bir yetenek sağlar.

Groovy hayranları için Kotlin inşaatçılar uygular; aslında, Kotlin kurucuları tip kontrol edilebilir. Kotlin, tembel özellikleri, gözlemlenebilir özellikleri, veto edilebilir özellikleri ve eşlenmiş özellikleri uygulamak için kullanılabilen temsilci özellikleri destekler.

Diğer dillerde bulunan birçok eşzamansız mekanizma, Kotlin coroutinleri kullanılarak kitaplıklar olarak uygulanabilir. Bu, C # ve ECMAScript'ten async/ awaitkanallarından, Go'dan ve generators/' yieldden C # ve Python'dan seçim içerir.

Kotlin'de fonksiyonel programlama

Üst düzey işlevlere izin vermek, Kotlin için işlevsel programlama öyküsünün sadece başlangıcıdır. Dil ayrıca yüksek dereceli işlevleri, anonim işlevleri, lambdaları, satır içi işlevleri, kapanışları, kuyruk özyinelemesini ve jenerikleri de destekler. Diğer bir deyişle Kotlin, işlevsel bir dilin tüm özelliklerine ve avantajlarına sahiptir. Örneğin, aşağıdaki işlevsel Kotlin deyimlerini düşünün.

Kotlin'de bir listeyi filtreleme

val pozitifler = list.filter {x -> x> 0}

Daha da kısa bir ifade için, itlambda işlevinde yalnızca tek bir parametre olduğunda kullanın :

val pozitifler = list.filter {it> 0}

Kotlin'de bir haritayı / çiftlerin listesini dolaşmak

(haritada (k, v) için) {println (“$ k -> $ v”)}

kve  v herhangi bir şey çağrılabilir.

Kotlin'de aralıkları kullanma

for (  1..100'de i ) {...} // kapalı aralık: 100'ü içerir

for (  1'den 100'e kadar) {...} // yarı açık aralık: 100'ü içermez

(  2..10 adımda x ) {...}

için (x in  10 downTo 1) {...}

eğer (  1..10'da x ) {...}

Yukarıdaki örnekler  for anahtar kelimeyi ve aralıkların kullanımını göstermektedir.

Kotlin tam teşekküllü bir işlevsel programlama dili olmasına rağmen, Java'nın nesne yönelimli doğasının çoğunu alternatif bir programlama stili olarak korur ve mevcut Java kodunu dönüştürürken çok kullanışlıdır. Kotlin, iç içe iç ve anonim iç sınıflar ile birlikte kurucular ile sınıfları vardır ve Java 8. Kotlin yok gibi arabirimleri vardır değil bir var newanahtar sözcüğü. Bir sınıf örneği oluşturmak için yapıcıyı normal bir işlev gibi çağırın. Bunu yukarıdaki ekran görüntüsünde gördük.

Kotlin adlandırılmış üst sınıftan tek mirası vardır ve tüm Kotlin sınıfları varsayılan bir üst sınıf var Anyolduğunu değil , Java temel sınıf ile aynı java.lang.Object. AnySadece üç önceden tanımlanmış üye işlevlerini içerir: equals(), hashCode(), ve toString().

Kotlin sınıfları, opendiğer sınıfların onlardan miras almasına izin vermek için anahtar kelime ile işaretlenmelidir ; Bunların kalıtım yoluyla olduğu gibi Java sınıfları, karşısındaki tür olmadıkça ile işaretlenmiş finalanahtar kelime. Bir üst sınıf yöntemini geçersiz kılmak için, yöntemin kendisi işaretlenmeli openve alt sınıf yöntemi işaretlenmelidir override. Bu, Kotlin'in varsayılanlara güvenmek yerine işleri açık hale getirme felsefesinin bir parçasıdır. Bu özel durumda, Kotlin'in temel sınıf üyelerini kalıtım için açık olarak işaretleme yönteminin ve geçersiz kılmalar olarak türetilmiş sınıf üyelerini açıkça işaretleme yönteminin çeşitli yaygın Java hatalarından kaçındığını görebilirim.

Kotlin'deki güvenlik özellikleri

Yaygın hatalardan kaçınmaktan bahseden Kotlin, boş işaretçi referansları tehlikesini ortadan kaldırmak ve boş değerlerin işlenmesini kolaylaştırmak için tasarlandı. Bunu, nullstandart türler için geçersiz hale getirerek , null yapılabilir türler ekleyerek ve null testlerini işlemek için kısayol gösterimleri uygulayarak yapar.

Örneğin, tipteki normal bir değişken  şunları tutamaz  :String null

var a: String = "abc"

a = null // derleme hatası

Boş değerlere izin vermeniz gerekiyorsa, örneğin SQL sorgu sonuçlarını tutmak için, türe bir soru işareti ekleyerek null yapılabilir bir tür bildirebilirsiniz, örn String?.

var  b: Dize?

b = boş  // tamam

Korumalar biraz daha ileri gidiyor. Null yapılamayan bir türü cezasızlıkla kullanabilirsiniz, ancak kullanmadan önce boş değerler için null yapılabilir bir türü test etmeniz gerekir.

Kotlin, normalde boş test için gerekli olan ayrıntılı dilbilgisinden kaçınmak için , yazılı güvenli bir çağrı sunar?. . Örneğin, döner eğer değildir ve aksi. Bu ifadenin türü .b?.length b.lengthbnullnullInt?

Başka bir deyişle, b?.lengthiçin bir kısayol if (b != null) b.length else null. Bu sözdizimi güzel bir şekilde zincirlenir ve oldukça fazla sayıda prolix mantığını ortadan kaldırır, özellikle de herhangi biri başarısız olabilecek bir dizi veritabanı sorgusundan bir nesne doldurulduğunda. Örneğin, bob?.department?.head?.nameBob, departman ve departman başkanı boş değilse, Bob'un departman başkanının adını döndürür.

Yalnızca boş olmayan değerler için belirli bir işlemi gerçekleştirmek için güvenli arama operatörünü aşağıdakilerle ?.birlikte  kullanabilirsiniz let:

val listWithNulls: List = listOf ("A", null)

for (listWithNulls içindeki öğe) {

      item? .let {println (it)} // A yazdırır ve boş değeri yok sayar}

Genellikle, boş verilebilir bir ifadeden geçerli ancak özel bir değer döndürmek istersiniz, böylece genellikle onu null yapılamayan bir türe kaydedebilirsiniz. Bunun için Elvis operatörü adı verilen özel bir sözdizimi var (şaka yapmıyorum), yazılmış ?:.

val l = b? .length?: -1

eşdeğerdir 

değer l: Int = if (b! = null) b.length else -1

Aynı şekilde Kotlin, yakalanması gereken fırlatılabilir koşullar olan Java'nın kontrol edilen istisnalarını atlar . Örneğin, JDK imzası

Eklenebilir eklenti (CharSequence csq)  IOException oluşturur;

IOExceptionbir appendyöntemi her çağırdığınızda yakalamanızı gerektirir :

Deneyin {

  log.append (mesaj)

}

catch (IOException e) {

  // İstisna ile bir şeyler yapın

}

Java tasarımcıları bunun iyi bir fikir olduğunu ve programcılar catchmaddede mantıklı bir şey uyguladıkları sürece bunun oyuncak programları için net bir kazanç olduğunu düşündüler . Çoğu zaman büyük bir Java programlarında, ancak, zorunlu olduğu kodunu görmek catchfıkra başka bir şey bir yorum içeriyor: //todo: handle this. Bu kimseye yardımcı olmuyor ve kontrol edilen istisnaların büyük programlar için net bir kayıp olduğu ortaya çıktı.

Kotlin eşgüdümleri

Kotlin'deki Coroutinler aslında hafif ipliklerdir. Bunları launchbazılarının bağlamında coroutine oluşturucu ile başlatırsınız CoroutineScope. En kullanışlı coroutine kapsamlarından biri runBlocking{}, kod bloğunun kapsamı için geçerli olandır .

import kotlinx.coroutines. *

fun main () = runBlocking {// this: CoroutineScope

    {// runBlocking kapsamında yeni bir ortak kullanım başlat

        gecikme (1000L) // 1 saniye için engellemesiz gecikme

        println ("Dünya!")

    }

    println ("Merhaba,")

}

Bu kod, satırlar arasında bir saniyelik gecikmeyle aşağıdaki çıktıyı üretir:

Merhaba,

Dünya!

Android için Kotlin

Mayıs 2017'ye kadar, Android için resmi olarak desteklenen tek programlama dilleri Java ve C ++ idi. Google, Google I / O 2017'de Android için Kotlin için resmi desteğini duyurdu ve Android Studio 3.0 ile başlayan Kotlin, Android geliştirme araç setinde yerleşik olarak bulunuyor. Kotlin, bir eklenti ile Android Studio'nun önceki sürümlerine eklenebilir.

Kotlin, Java ile aynı bayt koduna göre derler, Java sınıfları ile doğal yollarla birlikte çalışır ve araçlarını Java ile paylaşır. Kotlin ve Java arasında ileri geri arama için ek yük olmadığı için, Kotlin'i aşamalı olarak Java'da bulunan bir Android uygulamasına eklemek mükemmel bir anlam ifade ediyor. Yalnızca Java set özellikleri gibi Kotlin ve Java kodu arasındaki birlikte çalışabilirliğin zarafetten yoksun olduğu birkaç durum nadiren karşılaşılır ve kolayca düzeltilir.

Pinterest, Kasım 2016 gibi erken bir tarihte Kotlin'de yazılan Android uygulamalarının poster çocuğuydu ve Kotlin duyurusunun bir parçası olarak Google I / O 2017'de belirgin bir şekilde bahsedildi. Ayrıca Kotlin ekibi, Android için Evernote, Trello, Square ve Coursera uygulamalarına atıfta bulunmayı seviyor.

Kotlin ve Java

Yeni geliştirme için Kotlin mi yoksa Java mı seçileceği sorusu, Google I / O duyurusundan bu yana Android topluluğunda çokça gündeme geliyordu, ancak insanlar zaten Kotlin 1.0'ın piyasaya sürüldüğü Şubat 2016'da soruyu soruyordu. Kısa cevap, Kotlin kodunun Java kodundan daha güvenli ve daha özlü olduğu ve Kotlin ve Java dosyalarının Android uygulamalarında bir arada bulunabilmesidir, böylece Kotlin sadece yeni uygulamalar için değil, aynı zamanda mevcut Java uygulamalarını genişletmek için de yararlıdır.

Java'yı Kotlin'e tercih etmek için gördüğüm tek ikna edici argüman, tam Android geliştirmeye yeni başlayanlar için olurdu. Tarihsel olarak çoğu Android dokümantasyonu ve örneğinin Java'da olduğu düşünüldüğünde, onlar için aşılması gereken bir engel olabilir. Öte yandan, Android Studio'da Java'yı Kotlin'e dönüştürmek, Java kodunu bir Kotlin dosyasına yapıştırmak kadar basit bir meseledir.

Android geliştirme yapan hemen hemen herkes için Kotlin'in avantajları ikna edici. Bir Java geliştiricisinin Kotlin'i öğrenmesi için verilen tipik süre birkaç saattir - boş referans hatalarını ortadan kaldırmak, uzantı işlevlerini etkinleştirmek, işlevsel programlamayı desteklemek ve eşgüdümler eklemek için ödenmesi gereken küçük bir ücret. Tipik kaba tahmin, Java'dan Kotlin'e kod satırı sayısında yaklaşık yüzde 40'lık bir kesintiyi gösterir.