Kotlin programlama dilini öğrenin

Kotlin bir programlama dilidir yaygın olarak kullanılan bir teknoloji. Bu konu bir Kotlin olarak sunuluyor hızlıca öğrenmenizi sağlayacak hızlandırılmış kursu izleyebilirsiniz.

Değişken bildirimi

Kotlin, değişkenleri bildirmek için iki farklı anahtar kelime kullanır: val ve var.

  • Değeri hiç değişmeyen bir değişken için val kullanın. Bir değeri yeniden atayamazsınız işlevi val kullanarak bildirilen bir değişkene dönüştürülür.
  • Değeri değişebilen bir değişken için var kullanın.

Aşağıdaki örnekte, count Int türünde bir değişkendir ve 10 başlangıç değeri:

var count: Int = 10

Int, bir tam sayıyı temsil eden bir türdür. Bu tür bir sayıdaki sayısal türlerden biri Kotlin biçiminde temsil edilebilir. Diğer dillerle benzer şekilde, Sayısal verilerinize bağlı olarak Byte, Short, Long, Float ve Double.

var anahtar kelimesi, değerleri count öğesine gerektiği gibi yeniden atayabileceğiniz anlamına gelir. Örneğin, 10 olan count değerini 15 olarak değiştirebilirsiniz:

var count: Int = 10
count = 15

Bununla birlikte, bazı değerler değiştirilmek zorunda değildir. Şu ada sahip bir String düşünün: languageName. languageName öğesinin her zaman bir değere sahip olmasını istiyorsanız Örneğin, val anahtar kelimesini kullanarak languageName belirtebilirsiniz:

val languageName: String = "Kotlin"

Bu anahtar kelimeler, nelerin değiştirilebileceği konusunda açık olmanızı sağlar. Bu araçları şu amaçlarla kullanabilirsiniz: gerektiği şekilde ele alacağız. Bir değişken referansının yeniden atanabilir olması gerekiyorsa bunu var olarak tanımlamalısınız. Aksi durumda val politikasını kullanın.

Tür çıkarımı

Önceki örnekten devam edersek, languageName gibi bir komut dosyası kullanıyorsanız, Kotlin derleyicisi, atanan değeri ifade eder.

"Kotlin" değeri String türünde olduğu için derleyici, languageName aynı zamanda String. Kotlin'in statik olarak yazılmış bir yöntem olduğunu unutmayın dili'ne dokunun. Bu, türün derleme sırasında çözümlendiği ve hiçbir zaman anlamına gelir.

Aşağıdaki örnekte languageName, bir String olarak tahmin edildiği için String sınıfının parçası olmayan işlevleri çağırın:

val languageName = "Kotlin"
val upperCaseName = languageName.toUpperCase()

// Fails to compile
languageName.inc()

toUpperCase(), yalnızca şu türdeki değişkenlerde çağrılabilen bir işlevdir: String. Kotlin derleyicisi, languageName sonucunu String olarak tahmin ettiğinden, toUpperCase() hattını güvenle arayabilirsiniz. Ancak inc(), bir Int operatörüdür işlevi, dolayısıyla String üzerinde çağrılamaz. Kotlin’in türe yaklaşımı hem özlü hem de tür güvenliğini sağlar.

Boş güvenlik

Bazı dillerde, referans türü değişkeni sağlanmadan bildirilebilir açıkça belirten bir başlangıç değeridir. Bu durumlarda, değişkenler genellikle bir null değer. Kotlin değişkenleri varsayılan olarak boş değer içeremez. Bu, şu snippet geçersiz:

// Fails to compile
val languageName: String = null

Bir değişkenin null değer alabilmesi için null türünde olması gerekir. Şunları yapabilirsiniz: türünü son eki ? olarak ekleyerek bir değişkeni boş değer olarak belirtin (gösterildiği gibi) aşağıdaki örnekte:

val languageName: String? = null

Bir String? türüyle, şunlara bir String değeri veya null değeri atayabilirsiniz: languageName.

Boş değer atanabilir değişkenleri dikkatli bir şekilde işlemelisiniz. Aksi takdirde NullPointerException Örneğin, Java'da bir yöntem çağırmaya çalışırsanız çalışırsanız programınız kilitlenir.

Kotlin, boş değer atanarak güvenli bir şekilde çalışmak için çeşitli mekanizmalar sağlar değişkenlerine karşılık gelir. Daha fazla bilgi için bkz. Android'de yaygın Kotlin kalıpları: Boşluk.

Koşullar

Kotlin, koşullu mantığı uygulamak için çeşitli mekanizmalara sahiptir. En if-else ifadesi de en yaygın olanıdır. Sarmalanmış bir ifade if anahtar kelimesinin yanındaki parantezler true sonucunu verir, ardından içindeki kod (ör. kıvrık bir şekilde sarmalanmış ve hemen takip eden kod) küme ayraçları) yürütülür. Aksi takdirde else dalındaki kod yürütülür.

if (count == 42) {
    println("I have the answer.")
} else {
    println("The answer eludes me.")
}

else if kullanarak birden fazla koşulu ifade edebilirsiniz. Bu sayede, aşağıdaki örnekteki gibi tek bir koşullu ifadede daha ayrıntılı, karmaşık bir mantık aşağıdaki örneği inceleyin:

if (count == 42) {
    println("I have the answer.")
} else if (count > 35) {
    println("The answer is close.")
} else {
    println("The answer eludes me.")
}

Koşullu ifadeler, durum bilgili mantığı temsil etmek için yararlıdır ancak kendinizi tekrarladığınızı fark edeceksiniz. Yukarıdaki örnekte her dal için bir String yazdırmanız yeterlidir. Bu tekrardan kaçınmak için Kotlin, koşullu ifadeleri kullanın. Son örnek aşağıdaki gibi yeniden yazılabilir:

val answerString: String = if (count == 42) {
    "I have the answer."
} else if (count > 35) {
    "The answer is close."
} else {
    "The answer eludes me."
}

println(answerString)

Dolaylı olarak, her koşullu dal, kendi son satırda olduğundan return anahtar kelimesi kullanmanız gerekmez. Çünkü üç dal da String türündeyse, if-else ifadesinin sonucu ayrıca String türünde. Bu örnekte, answerString işlevine değeri-else ifadesinin sonucundaki değerdir. Tür çıkarımı, answerString için açık tür bildirimini çıkarın ancak bu genellikle iyi bir sonuçtur bunu daha anlaşılır hale getirmek düşünülebilir.

Koşullu ifadenizin karmaşıklığı arttıkça, aşağıdakileri göz önünde bulundurabilirsiniz: if-else ifadenizi bir when ifadesiyle değiştirin; şu örneği inceleyin:

val answerString = when {
    count == 42 -> "I have the answer."
    count > 35 -> "The answer is close."
    else -> "The answer eludes me."
}

println(answerString)

Bir when ifadesindeki her dal bir koşul, ok ve (->) ve bir sonuç. Okun sol tarafındaki durum doğru olarak değerlendirilirse, sağ taraftaki ifadenin sonucu geri döndü. Yürütme işleminin bir daldan diğerine geçmediğini unutmayın. when ifadesi örneğindeki kod, ancak daha kolay okunduğu anlaşılabilir.

Kotlin'in koşulları, Kotlin'in daha güçlü özelliklerinden birini öne çıkarıyor. akıllı yayınlama. Güvenli arama operatörü veya not-null yerine onay operatörünün boş değerlerle çalışmak üzere kullanılabilmesini sağlayın. Bunun yerine, değişkeni, koşullu bir ifade kullanan boş bir değere, aşağıdaki örnekte gösterilmektedir:

val languageName: String? = null
if (languageName != null) {
    // No need to write languageName?.toUpperCase()
    println(languageName.toUpperCase())
}

Koşullu dal içinde languageName, null olamaz olarak değerlendirilebilir. Kotlin, dalı yürütme koşulunun ne olduğunu öğrenecek kadar akıllıdır. languageName, null bir değer içermez. Bu nedenle, Bu dal içinde null değer olarak languageName. Bu akıllı yayınlama null için çalışır kontroller, tür kontrolleri ve bir şartları karşılayan sözleşme.

Fonksiyonlar

Bir veya daha fazla ifadeyi bir işlev halinde gruplandırabilirsiniz. Tekrarlamaktansa her sonuca ihtiyacınız olduğunda aynı ifade dizisini fonksiyonunda çağırın ve bunun yerine bu işlevi çağırın.

Bir işlev tanımlamak için fun anahtar kelimesini ve ardından işlev adını kullanın. Ardından, fonksiyonunuzun aldığı giriş türlerini (varsa) tanımlayın ve döndürdüğü çıkış türünü belirtmelidir. Bir fonksiyonun gövdesi, işleviniz çağrıldığında çağrılan ifadelerdir.

Önceki örneklere dayanarak, aşağıda eksiksiz bir Kotlin fonksiyonunu görebilirsiniz:

fun generateAnswerString(): String {
    val answerString = if (count == 42) {
        "I have the answer."
    } else {
        "The answer eludes me"
    }

    return answerString
}

Yukarıdaki örnekte bulunan fonksiyon generateAnswerString adına sahiptir. Google giriş kabul etmiyor. String türünde bir sonuç verir. Bir işlevini kullanın, adını ve ardından çağrı operatörünü (()) kullanın. aşağıdaki örnekte, answerString değişkeni generateAnswerString().

val answerString = generateAnswerString()

İşlevler, aşağıdaki örnekte gösterildiği gibi, bağımsız değişkenleri giriş olarak alabilir:

fun generateAnswerString(countThreshold: Int): String {
    val answerString = if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }

    return answerString
}

Bir işlev tanımlarken istediğiniz sayıda bağımsız değişken ve bağımsız değişkenleri belirtebilirsiniz. bulunur. Yukarıdaki örnekte, generateAnswerString() adlı bir bağımsız değişken adlı bir bağımsız değişken alır Int türünde countThreshold. Fonksiyonun içinde bağımsız değişkeni hakkında daha fazla bilgi edinin.

Bu işlevi çağırırken işlevin içine bir bağımsız değişken eklemeniz gerekir çağrının parantezleri:

val answerString = generateAnswerString(42)

Fonksiyon açıklamalarını basitleştirme

generateAnswerString() oldukça basit bir işlevdir. Fonksiyon, bir değişkeninden hemen sonra döndürülür. Tek bir ifadenin sonucu bir işlevden döndürüldüyse doğrudan değişken içeren bir işlevde yer alan if-else ifadesinin sonucunu döndürmek için aşağıdaki örnekte gösterilmektedir:

fun generateAnswerString(countThreshold: Int): String {
    return if (count > countThreshold) {
        "I have the answer."
    } else {
        "The answer eludes me."
    }
}

Return anahtar kelimesini atama operatörüyle de değiştirebilirsiniz:

fun generateAnswerString(countThreshold: Int): String = if (count > countThreshold) {
        "I have the answer"
    } else {
        "The answer eludes me"
    }

Anonim işlevler

Her işlevin bir adı olması gerekmez. Bazı fonksiyonlar Google Analytics 4'te geri bildirim vermelidir. Bu işlevlere anonim işlevler adı verilir. Siz isimsiz bir işleve referans tutabilir, bu referansı işlevini çağırabilirsiniz. Ayrıca referansı kullanıcılarınıza diğer referans türlerinde olduğu gibidir.

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

Adlandırılmış işlevler gibi anonim işlevler de herhangi bir sayıda ifade içerebilir. İşlevin döndürülen değeri, son ifadenin sonucudur.

Yukarıdaki örnekte, stringLengthFunc anonim bir girdi olarak String alan ve girişin uzunluğunu döndüren işlev Int türünün çıktısı olarak String. Bu nedenle, fonksiyonun türü (String) -> Int olarak belirtilir. Ancak bu kod, işlevi çağırmaz. İşlevin sonucunu almak için aşağıdaki gibi çağrılmalısınız: adlandırılmış işlev. stringLengthFunc numaralı telefonu ararken bir String sağlamalısınız. aşağıdaki örnekte gösterilmektedir:

val stringLengthFunc: (String) -> Int = { input ->
    input.length
}

val stringLength: Int = stringLengthFunc("Android")

Daha üst düzey işlevler

Bir işlev, bağımsız değişken olarak başka bir işlevi alabilir. Diğer bağımsız değişkenler olarak kullanılan işlevlere üst düzey işlevler adı verilir. Bu kalıp her bir bileşen arasında, her bir birimde olduğu gibi JavaScript'teki geri çağırma arayüzü.

Aşağıda, daha yüksek düzeyli bir işlev örneği verilmiştir:

fun stringMapper(str: String, mapper: (String) -> Int): Int {
    // Invoke function
    return mapper(str)
}

stringMapper() işlevi, String ile birlikte şu işleve sahip bir işlev alır: ona aktardığınız bir String'dan Int değeri türetir.

Bir String ve aşağıdaki gibi bir işlev ileterek stringMapper() öğesini çağırabilirsiniz: diğer giriş parametresini, yani bir String öğesini alan aşağıdaki örnekte gösterildiği gibi bir Int girişi ve çıkışını sağlar:

stringMapper("Android", { input ->
    input.length
})

Anonim işlev, bir işlevde tanımlanan last parametresiyse şunu yapabilirsiniz: işlevi çağırmak için kullanılan parantezlerin dışında ( şu örneği inceleyin:

stringMapper("Android") { input ->
    input.length
}

Anonim işlevler Kotlin standart kitaplığında bulunabilir. Örneğin, daha fazla bilgi için Daha Yüksek Sıralı İşlevler ve Lambdas.

Sınıflar

Şimdiye kadar bahsedilen tüm türler Kotlin programlamasına dahil edilmiştir dili'ne dokunun. Kendi özel türünüzü eklemek isterseniz bir sınıf tanımlayabilirsiniz aşağıdaki örnekte gösterildiği gibi class anahtar kelimesi kullanılır:

class Car

Özellikler

Sınıflar, özellikleri kullanarak durumu temsil eder. CEVAP property özelliği alıcı, belirleyici ve destek alanı içerebilen sınıf düzeyinde bir değişkendir. Araba sürmek için tekerlek gerektiğinden Wheel nesne listesini özelliği: Car özelliği:

class Car {
    val wheels = listOf<Wheel>()
}

wheels öğesinin bir public val olduğunu, yani wheels öğesinin şuradan erişilebilir olduğunu unutmayın: Car sınıfının dışındadır ve yeniden atanamaz. Bir web sitesi Car örneği için ilk olarak oluşturucusunu çağırmanız gerekir. Bu bölümden erişilebilir özelliklerine erişebilir.

val car = Car() // construct a Car
val wheels = car.wheels // retrieve the wheels value from the Car

Tekerleklerinizi özelleştirmek isterseniz, tekerleklerinizi istediğiniz şekilde sınıf özelliklerinizin nasıl başlatıldığını belirtir:

class Car(val wheels: List<Wheel>)

Yukarıdaki örnekte, sınıf oluşturucusu bir List<Wheel> öğesini kurucu bağımsız değişkeninden biridir ve wheels bağımsız değişkenini başlatmak için bu bağımsız değişkeni kullanır.

Sınıf işlevleri ve kapsülleme

Sınıflar, davranışı modellemek için işlevleri kullanır. İşlevler durumu değiştirebilir. Böylece, seçeneğini belirleyin. Bu erişim denetimi, kapsülasyon olarak bilinen daha geniş nesne odaklı bir kavram.

Aşağıdaki örnekte, doorLock özelliği her şeyden gizli tutulur Car sınıfının dışında. Arabanın kilidini açmak için unlockDoor() numarasını aramalısınız işlevi (aşağıdaki örnekte gösterildiği gibi) geçerli bir anahtarda iletmelidir:

class Car(val wheels: List<Wheel>) {

    private val doorLock: DoorLock = ...

    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

Bir mülke referans verme şeklini özelleştirmek isterseniz bir mülk belirleyicidir. Örneğin, bir mülkün bulunurken, belirleyicisine erişimi kısıtlarken, o belirleyiciyi private:

class Car(val wheels: List<Wheel>) {

    private val doorLock: DoorLock = ...

    var gallonsOfFuelInTank: Int = 15
        private set

    fun unlockDoor(key: Key): Boolean {
        // Return true if key is valid for door lock, false otherwise
    }
}

Özellikleri ve işlevlerin bir arada kullanılmasıyla, kolay kullanım olanağı sunan modeller.

Birlikte çalışabilirlik

Kotlin’in en önemli özelliklerinden biri, Java ile akıcı birlikte çalışabilmesidir. Kotlin kodu JVM bayt koduna derlendiği için Kotlin kodunuz ve tam tersi de geçerlidir. Bu da yeni paydaşlardan mevcut Java kitaplıklarını doğrudan Kotlin'den içe aktarın. Dahası, Android API'leri Java'da yazılır ve doğrudan Kotlin'den çağrılabilir.

Sonraki adımlar

Esnek ve pragmatik bir dil olan Kotlin'in desteği ve ivmesi artıyor. Biz (henüz denemediyseniz de denemenizi öneririm). Sonraki adımlar için: resmi Kotlin dokümanlarına göz atın kılavuz ile birlikte nasıl başvuracağınızla yaygın Kotlin kalıpları hakkında daha fazla bilgi edinin.