Kotlin 1.7.20 Yenilikler

Mustafa Kurt
IBTech
Published in
4 min readOct 13, 2022

Kotlin K2 derleyici eklentileri için destek

Kotlin ekibi, K2 derleyicisini stabilize etmeye devam ediyor. K2 hala Alpha’da ( Kotlin 1.7.0 sürümünde duyurulduğu gibi ), ancak şimdi birkaç derleyici eklentisini destekliyor. Yeni derleyici hakkında Kotlin ekibinden güncellemeler almak için bu YouTrack sorununu takip edebilirsiniz.

Bu 1.7.20 sürümünden başlayarak, Kotlin K2 derleyicisi aşağıdaki eklentileri destekler:

Not : Yeni K2 derleyicisinin Alpha sürümü yalnızca JVM projeleriyle çalışır. Kotlin/JS, Kotlin/Native veya diğer çok platformlu projeleri desteklemez.

K2 Videoları:

Language (Dil Yenilikleri)

Bu sürüm yeni ..<operatörü tanıtıyor. Kotlin, ..bir dizi değeri ifade eden operatöre sahiptir. Yeni ..<operatör, işlev gibi davranır untilve açık uçlu aralığı tanımlamanıza yardımcı olur. Araştırmamız, bu yeni operatörün açık uçlu aralıkları ifade etmede daha iyi bir iş çıkardığını ve üst sınırın dahil edilmediğini açıkça ortaya koyduğunu gösteriyor.

..<Operatörü bir whenifadede kullanmaya bir örnek :

Standart kitaplık API değişiklikleri

kotlin.rangesOrtak Kotlin standart kitaplığındaki paketlerde aşağıdaki yeni türler ve işlemler tanıtılacaktır :

Yeni OpenEndRange arayüzü

Açık uçlu aralıkları temsil eden yeni arayüz, ClosedRange<T> mevcut arayüze çok benzer:

interface OpenEndRange<T : Comparable<T>> {
// lower bound
val start: T
// upper bound, not included in the range
val endExclusive: T
operator fun contains(value: T): Boolean = value >= start && value < endExclusive
fun isEmpty(): Boolean = start >= endExclusive
}

OpenEndRange’i mevcut yinelenebilir aralıklarda uygulama

Geliştiriciler, hariç tutulan bir üst sınıra sahip bir aralık elde etmeleri gerektiğinde, şu anda untilaynı değerlerle kapalı yinelenebilir bir aralık oluşturmak için işlevi kullanırlar. Bu aralıkları alan yeni API'de kabul edilebilir kılmak için, OpenEndRange<T>bu arayüzü mevcut yinelenebilir aralıklarda uygulamak istiyoruz: IntRange, LongRange, CharRange, UIntRangeve ULongRange. Böylece hem ClosedRange<T>ve OpenEndRange<T>arayüzleri aynı anda uygulayacaklar.

class IntRange : IntProgression(...), ClosedRange<Int>, OpenEndRange<Int> {
override val start: Int
override val endInclusive: Int
override val endExclusive: Int
}

standart tipler için rangeUntil operatörleri

Operatörler , rangeUntilhalihazırda operatör tarafından tanımlanan aynı tipler ve kombinasyonlar için sağlanacaktır rangeTo. Bunları prototip amacıyla genişletme işlevleri olarak sağlıyoruz, ancak tutarlılık için açık uçlu aralıklar API'sini stabilize etmeden önce onları daha sonra üye yapmayı planlıyoruz.

..< operatörü nasıl etkinleştirilir

Operatörü kullanmak ..<veya bu operatör kuralını kendi türleriniz için uygulamak için -language-version 1.8derleyici seçeneğini etkinleştirin.

Standart türlerin açık uçlu aralıklarını desteklemek için tanıtılan yeni API öğeleri, deneysel bir stdlib API için her zamanki gibi bir onay gerektirir: @OptIn(ExperimentalStdlibApi::class). Alternatif olarak, -opt-in=kotlin.ExperimentalStdlibApiderleyici seçeneğini kullanabilirsiniz.

Veri nesneleri ile tekil ve mühürlü sınıf hiyerarşileri için geliştirilmiş dize temsilleri

Bu sürüm, kullanmanız için yeni bir objectbildirim türü sunar: data object. Veri nesnesi kavramsal olarak normal bir bildirimle aynı şekilde davranır ancak kutudan çıktığı gibi objecttemiz bir temsille birlikte gelir .toString

package org.example 
object MyObject
data object MyDataObject
fun main() {
println(MyObject) // org.example.MyObject@1f32e575 println(MyDataObject) // MyDataObject
}

Bu, data objectbildirimleri, bildirimlerin yanında kullanabileceğiniz mühürlü sınıf hiyerarşileri için mükemmel hale getirir data class. Bu snippet'te, düz yerine a EndOfFileolarak bildirmek, onu manuel olarak geçersiz kılmaya gerek kalmadan güzelleşeceği ve beraberindeki tanımlarla simetriyi koruyacağı anlamına gelir :data object object toString data class

sealed class ReadResult {
data class Number(val value: Int) : ReadResult()
data class Text(val value: String) : ReadResult()
data object EndOfFile : ReadResult()
}
fun main() {
println(ReadResult.Number(1)) // Number(value=1)
println(ReadResult.Text("Foo")) // Text(value=Foo)
println(ReadResult.EndOfFile) // EndOfFile
}

Yeni oluşturucu türü çıkarım kısıtlamaları

Kotlin 1.7.20 , kodunuzu etkileyebilecek oluşturucu türü çıkarımının kullanımına bazı önemli kısıtlamalar getirir. Bu kısıtlamalar, lambda’nın kendisini analiz etmeden parametreyi türetmenin imkansız olduğu, oluşturucu lambda işlevlerini içeren kod için geçerlidir. Parametre argüman olarak kullanılır. Şimdi, derleyici bu tür kod için her zaman bir hata gösterecek ve türü açıkça belirtmenizi isteyecektir.

Bu son derece önemli bir değişiklik, ancak araştırmamız bu durumların çok nadir olduğunu ve kısıtlamaların kodunuzu etkilememesi gerektiğini gösteriyor. Eğer yaparlarsa, aşağıdaki durumları göz önünde bulundurun:

  • Üyeleri gizleyen uzantıya sahip oluşturucu çıkarımı.
  • Kodunuz, oluşturucu çıkarımı sırasında kullanılacak aynı ada sahip bir uzantı işlevi içeriyorsa, derleyici size bir hata gösterecektir:
class Data {
fun doSmth() {} // 1
}

fun <T> T.doSmth() {} // 2

fun test() {
buildList {
this.add(Data())
this.get(0).doSmth() // Resolves to 2 and leads to error
}
}

Kodu düzeltmek için türü açıkça belirtmelisiniz:

Birden çok lambda ile oluşturucu çıkarımı ve tür bağımsız değişkenleri açıkça belirtilmemiştir.

Oluşturucu çıkarımında iki veya daha fazla lambda bloğu varsa, türü etkiler. Bir hatayı önlemek için derleyici, türü belirtmenizi ister:

Hatayı düzeltmek için türü açıkça belirtmeli ve tür uyumsuzluğunu düzeltmelisiniz:

Delagate

Kotlin 1.6.0'da, $delegate alanını atlayarak ve başvurulan özelliğe anında erişim oluşturarak bir mülke yetki verme durumunu optimize ettik. 1.7.20'de bu optimizasyonu daha fazla durum için uyguladık. Bir temsilci aşağıdaki durumlarda ise $delegate alanı artık atlanacak:

Adlandırılmış bir nesne:

Bir destek alanına ve aynı modülde varsayılan bir alıcıya sahip bir final val property:

val impl: ReadOnlyProperty<Any?, String> = ...
class A {
val s: String by impl }

Sabit bir ifade, bir enum girişi, bu veya null. İşte buna bir örnek:

class A {     
operator fun getValue(thisRef: Any?, property: KProperty<*>) ... val s by this
}

Daha fazla bilgi için buraya bakabilirsiniz:

https://kotlinlang.org/docs/delegated-properties.html

Ayrıca tüm yenilikleri aşağıdaki linkten daha detaylı inceleyebilirsiniz.

https://kotlinlang.org/docs/whatsnew1720.html

--

--