Nima uchun Kotlinga butunlay o'tishingiz kerak

Zamonaviy dasturlash tilidan foydalanishni boshlash vaqti keldi

Men sizga Kotlin deb nomlangan yangi dasturlash tili haqida aytib bermoqchiman va nega uni keyingi loyihangiz uchun ko'rib chiqishingiz kerak. Men Java-ni afzal ko'rardim, lekin o'tgan yili men Kotlin-ni kodlayotgandek topdim va hozircha Java-ni yaxshiroq tanlash kerak bo'lgan vaziyat haqida o'ylay olmayman.

Bu JetBrains tomonidan ishlab chiqilgan va IntelliJ va ReSharper kabi IDE to'plamining orqasida turgan odamlar haqiqatan ham Kotlinda porlaydi. Bu pragmatik va qisqa va kodlashni qoniqarli va samarali tajribaga aylantiradi.

Kotlin ikkala JavaScript va tez orada mashina kodlarini tuzadi, ammo men uning asosiy muhitiga - JVMga e'tibor qarataman.

Kotlinga to'liq o'tishning bir necha sabablari bor (hech qanday maxsus tartibda):

0 # Java bilan ishlash

Kotlin Java bilan 100% o'zaro ishlaydi. Kotlin-dan foydalanib, o'zingizning eski Java loyihalaringizda ishlashni davom ettirishingiz mumkin. Java-ning barcha sevimli ramkalari hali ham mavjud va Kotlin-da yozgan har qanday asosni sizning o'jar Java do'stingiz osongina qabul qiladi.

1 # tanish sintaksis

Kotlin akademiyada tug'ilgan g'alati til emas. Uning sintaksisi OOP domenidan keladigan har qanday dasturchi uchun tanish va get-go-dan ko'proq yoki kamroq tushunilishi mumkin. Albatta qayta ishlangan konstruktorlar yoki val o'zgaruvchan deklaratsiyalar kabi Java-dan farqlar mavjud. Quyidagi parcha asosiy asoslarni taqdim etadi:

sinf Foo {

    val b: String = "b" // val o'zgarmasligini anglatadi
    var i: Int = 0 // var o'zgarishi mumkin degan ma'noni anglatadi

    qiziqarli salom () {
        val str = "Salom"
        bosib chiqarish ("$ str World")
    }

    kulgili summa (x: Int, y: Int): Int {
        x + y ni qaytaring
    }

    qiziqarli maxOf (a: suzuvchi, b: suzuvchi) = if (a> b) a b

}

2 # String Interpolation

Go'yo Java-ning String.format () tilining yanada tushunarli va o'qilishi mumkin bo'lgan versiyasi:

val x = 4
val y = 7
print ("$ x va $ y summasi $ {x + y}") // 4 va 7 ning yig'indisi 11 ga teng

3 # turdagi qo'llanma

Kotlin qaerda bo'lishingizdan qat'i nazar sizning o'qish turingizni yaxshilaydi:

val a = "abc" // satrda berilgan
val b = 4 // turi Int

val c: Double = 0.7 // turi aniq e'lon qilingan
val d: List  = ArrayList () // turi aniq e'lon qilingan

4 # Aqlli Kastlar

Kotlin kompilyatori sizning mantiqiy ma'lumotlaringizni kuzatib boradi va iloji bo'lsa avtostrastlash turlarini tekshiradi, bu aniq tekshiruvlardan keyin boshqa tekshiruvlar mavjud emasligini anglatadi:

if (obj String bo'lsa) {
    print (obj.toUpperCase ()) // obj endi String ekanligi ma'lum bo'ldi
}

5 # Intuitiv tengliklar

Siz tenglik () ni chaqirishni aniq to'xtatishingiz mumkin, chunki == operatori endi tizimning tengligini tekshiradi:

val john1 = Shaxs ("Jon")
val john2 = Shaxs ("Jon")
john1 == john2 // true (tarkibiy tenglik)
john1 === john2 // yolg'on (mos yozuvlar tengligi)

6 # standart dalillar

Turli xil dalillar bilan bir nechta shunga o'xshash usullarni aniqlashning hojati yo'q:

qiziqarli qurish (sarlavha: tor, kenglik: Int = 800, balandlik: Int = 600) {
    Ramka (sarlavha, kenglik, balandlik)
}

7 # Nomlangan argumentlar

Odatiy dalillar bilan birlashtirilgan, nomlangan argumentlar quruvchilarga bo'lgan ehtiyojni bekor qiladi:

qurish ("PacMan", 400, 300) // ekvivalent
qurish (sarlavha = "PacMan", kenglik = 400, balandlik = 300) // ekvivalent
qurish (kengligi = 400, balandligi = 300, sarlavha = "PacMan") // ekvivalent

8 # ifoda qachon

Kommutatsiya sumkasi ifoda etilganda ancha oson o'qiladigan va moslashuvchan bilan almashtiriladi:

qachon (x) {
    1 -> bosib chiqarish ("x 1")
    2 -> bosib chiqarish ("x 2")
    3, 4 -> bosib chiqarish ("x 3 yoki 4")
    5..10 -> bosib chiqarish ("x 5, 6, 7, 8, 9 yoki 10")
    else -> print ("x chegaradan tashqarida")
}

U ham ibora, ham bayonot sifatida ishlaydi, va ular bilan yoki isbot qilmasdan:

val res: Boolean = qachon {
    obj == null -> noto'g'ri
    obj String -> rost
    else -> tashlash IllegalStateException ()
}

9 # Xususiyatlar

Shaxsiy maydon va olish xatti-harakatlarini jamoat maydonlariga qo'shish mumkin, ya'ni biz aqlsiz kiruvchi va sozlovchilar bilan bizning kodimizni to'ldirishni to'xtatishimiz mumkin.

sinf ramkasi {
    var kengligi: Int = 800
    var balandligi: Int = 600

    val piksel: Int
        get () = en * balandlik
}

10 # Ma'lumotlar sinfi

Bu POJO toString (), teng (), hashCode () va nusxa ko'chirish () bilan to'ldirilgan va Java-dan farqli o'laroq 100 ta satr kodlarini o'z ichiga olmaydi:

ma'lumotlar sinfi shaxs (val nomi: String,
                  var email: String,
                  var yoshi: Int)

val john = Shaxs ("Jon", "john@gmail.com", 112)

11 # Operatorni ortiqcha yuklash

O'qish qobiliyatini yaxshilash uchun oldindan belgilangan operatorlar to'plamiga ortiqcha yuk tushishi mumkin:

ma'lumotlar klassi Vec (val x: suzuvchi, val y: suzuvchi) {
    operator fun plus (v: Vec) = Vec (x + v.x, y + v.y)
}

val v = Vec (2f, 3f) + Vec (4f, 1f)

12 # halokat to'g'risidagi deklaratsiyalar

Ba'zi ob'ektlarni yo'q qilish mumkin, masalan, xaritalarni takrorlash uchun foydalidir:

uchun ((kalit, qiymat) xaritada) {
    chop etish ("Kalit: $ tugmasi")
    chop etish ("Qiymat: $ value")
}

13 # Turlar

O'qish uchun:

uchun (i 1..100 ichida) {...}
uchun (i 0 dan 100 gacha) {...}
for (i 2..10 bosqichning 2-bosqichida) {...}
uchun (i 10dan pastga 1) {...}
if (x 1..10 ichida) {...}

14 # Kengaytma funktsiyalari

Siz birinchi marta Java-da ro'yxatni saralashni eslaysizmi? Siz sort () funktsiyasini topolmadingiz, shuning uchun ham siz o'qituvchingizdan yoki google-dan Collections.sort () haqida bilib olishingizni so'rashingiz kerak edi. Keyinchalik, siz String bosh harfini yozishga to'g'ri kelganda, siz o'zingizning yordamchi funktsiyangizni yozishni yakunladingiz, chunki StringUtils.capitalize () haqida bilmas edingiz.

Agar eski sinflarga yangi funktsiyalarni qo'shish imkoniyati mavjud bo'lsa edi; shu bilan IDE kodni to'ldirishda kerakli funktsiyani topishga yordam beradi. Kotlinda siz aniq narsani qilishingiz mumkin:

qiziqarli String.replaceSpaces (): String {
    return this.replace ('', '_')
}

val formatlangan = str.replaceSpaces ()

Standart kutubxona Java-ning asl turlarini kengaytiradi, bu String uchun ayniqsa zarur edi:

str.removeSuffix (". txt")
str.capitalize ()
str.substringAfterLast ("/")
str.replaceAfter (":", "tasniflangan")

15 # Null xavfsizligi

Java bu deyarli harflar bilan yozilgan til deb ataladigan narsadir. Unda String turidagi o'zgaruvchiga Stringga murojaat qilish kafolatlanmagan - u nolga ishora qilishi mumkin. Biz bunga o'rganib qolgan bo'lsak ham, bu statik turlarni tekshirish xavfsizligini buzadi va natijada Java dasturchilari NPElardan doimiy qo'rquvda yashashlari kerak.

Kotlin null bo'lmagan turlarni va nol bo'lmagan turlarni ajratish orqali hal qiladi. Turlari sukut bo'yicha nolga teng emas va quyidagiga quyidagini qo'shib nolga aylanishi mumkin:

var a: String = "abc"
a = null // kompilyatsiya xatosi

var b: String? = "xyz"
b = null // muammo yo'q

Kotlin sizni nosog'lom turga kirganingizda NPElardan ehtiyot bo'lishga majbur qiladi:

val x = b.length // kompilyatsiya xatosi: b nol bo'lishi mumkin

Va bu juda qiyin bo'lib tuyulishi mumkin bo'lsa-da, uning ba'zi xususiyatlari tufayli chindan ham shabada. Bizda hali ham null bo'lmagan turlari mavjud aqlli kastlar mavjud:

agar (b == null) bo'lsa
val x = b.length // muammo yo'q

Shuningdek, biz NPE ulash o'rniga nolga teng bo'lgan xavfsiz qo'ng'iroqni ham ishlatamiz.

val x = b? .length // x turi nolga teng Int

Xavfsiz qo'ng'iroqlar, ba'zida boshqa tillarda yozadigan, agar null bo'lmagan tekshiruvlarning oldini olish uchun bir-biriga zanjirlangan bo'lishi mumkin va agar biz noldan boshqa standart qiymatni xohlasak, biz elvis operatoridan foydalanishimiz mumkinmi? ::

val name = kema?. kapitan? .name?: "noma'lum"

Agar bularning hech biri siz uchun ishlamasa va sizga NPE kerak bo'lsa, buni aniq talab qilishingiz kerak bo'ladi:

val x = b? .length?: otish NullPointerException () // quyida bo'lgani kabi
val x = b !!. uzunligi // yuqoridagi kabi

16 # yaxshiroq Lambdas

Ey bolam, bu yaxshi lambda tizimi, ba'zi oqilona dizayn tanlovlari tufayli o'qish va teranlik o'rtasida mukammal darajada muvozanatlangan tizim. Sintaksis birinchi navbatda oldinga siljiydi:

val sum = {x: Int, y: Int -> x + y} // turi: (Int, Int) -> Int
val res = sum (4,7) // res == 11

Va bu erda aqlli bitlar keladi:

  1. Agar lambda usulning oxirgi yoki yagona argumenti bo'lsa, usul qavsini boshqa joyga ko'chirish yoki o'tkazib yuborish mumkin.
  2. Agar biz bitta argument-lambda argumentini e'lon qilmasak, u aniq uning nomi ostida e'lon qilinadi.

Ushbu faktlar birlashtirilib, quyidagi uchta chiziqni tenglashtiradi:

numbers.filter ({x -> x.isPrime ()})
numbers.filter {x -> x.isPrime ()}
numbers.filter {it.isPrime ()}

Va bu bizga qisqa funktsional kodni yozishimizga imkon beradi - shunchaki bu go'zallikka qarang:

shaxslar
    .filter {it.age> = 18}
    .sortedBy {it.name}
    .map {it.email}
    .for {chop eting (bu)}

Kotlin lambda tizimi kengaytma funktsiyalari bilan birgalikda uni DSL yaratish uchun ideal holga keltiradi. Android-ni rivojlantirishga qaratilgan DSL-ning namunasini Anko-dan tekshirib ko'ring:

vertikal joylashish {
    to'ldirish = botirish (30)
    editText {
        ishora = "Ism"
        textSize = 24f
    }
    editText {
        ishora = "Parol"
        textSize = 24f
    }
    tugmasi ("Kirish") {
        textSize = 26f
    }
}

17 # IDE-ni qo'llab-quvvatlash

Agar siz Kotlin-dan boshlamoqchi bo'lsangiz, bir nechta variantingiz bor, lekin men Kotlin bilan birlashtirilgan IntelliJ-ni ishlatishni tavsiya qilaman - uning xususiyatlari bir xil odamlarning tilini va IDE-ni yaratishda afzalliklarini namoyish etadi.

Sizga mayda-chuyda, ammo aqlli misol berish uchun, men birinchi marta Java kodni Stack Overflow-dan nusxa ko'chirishga harakat qilganimda paydo bo'ldi:

Agar Java kodini Kotlin fayliga qo'ygan bo'lsangiz, IntelliJ buni sezadi

Va bularning barchasi hozircha. O'qiganingiz uchun tashakkur! Bu mening birinchi o'rta lavozimim.

Tuzatish: Men nihoyat Katta Portlashdan keyingi barcha voqealarni bir yillik taqvimga joylashtirgan ikkinchi o'rta lavozimimni tugatdim. Bu juda qisqa xulosa qilingan hamma narsa deb nomlangan.