Was ist neu in Kotlin 1.6?

0
136
Trismegist san/Shutterstock.com< /figure>

Kotlin 1.6 kommt mit neuen Features, einem verbesserten experimentellen Speichermanager und einer verbesserten Standardbibliothek. Die Ergänzungen helfen reifen JetBrains’ zunehmend beliebte plattform- und disziplinübergreifende Sprache.

Neuer Native Memory Manager

Die wohl größte Veränderung für das Kotlin-Ökosystem ist die Ankunft des neuen Speichermanagers für Kotlin Native. Obwohl es immer noch als Entwicklervorschau gekennzeichnet ist, steht der aktualisierte Manager stellvertretend für die Richtung, die Kotlin in Zukunft einschlagen wird.

Das überarbeitete Design ist besser gerüstet, um mit den verschiedenen Kompilierungs-Backends umzugehen, mit denen Kotlin in nativen Plattformcode für iOS und Android umgewandelt wird. Manchmal erfordern die Plattformen unterschiedliche Optimierungen für einen bestimmten Vorgang. Der aktuelle Ansatz schränkt die Parallelität ein und kann ohne besondere Aufmerksamkeit der Entwickler zu Speicherlecks führen.

Der Speichermanager der nächsten Generation behebt diese Mängel. Es bietet leckagefreie Primitive für gleichzeitige Operationen, die so wie sie sind sicher verwendet werden können. Die Änderungen bringen auch das native Speichermanagement in eine größere Gleichheit mit dem bestehenden Speichermanager für die JVM-Entwicklung.

Das neue System ist zwar in Kotlin 1.6 verfügbar, aber derzeit nicht für den Produktionseinsatz vorgesehen. In einigen Situationen kann die Leistung im Vergleich zum Legacy-Speichermanager um das bis zu fünffache reduziert werden. Die Entwicklung einer leistungsfähigen Version, die zur allgemeinen Einführung bereit ist, wird fortgesetzt.

Sealed-When-Statements

Mit Sealed when-Anweisungen erhalten Sie eine Compiler-Warnung, wenn Sie vergessen, einen möglichen Fall zu behandeln. Wenn Sie eine versiegelte Klasse, einen booleschen Typ oder eine Aufzählung an ein when übergeben, möchten Sie normalerweise für jeden möglichen Eingabewert eine explizite Vorgehensweise anwenden:

abgedichteter Klasse Antrieb { Datenklasse Electric(val Power: Int) : Antriebsstrang() Datenklasse Diesel(val Leistung: Int) : Antriebsstrang() Datenklasse Hybrid(val Diesel: Drivetrain, val Electric: Drivetrain) : Antriebsstrang() }   Spaß getTotalPowerKwh(Antriebsstrang: DriveTrain) : Int { wenn (Antriebsstrang) { ist Antriebsstrang.Diesel -> drivetrain.Diesel.Power ist Drivetrain.Electric -> Antrieb.Elektrische.Leistung } } Werbung

Im obigen Beispiel enthält die versiegelte Klasse des Antriebsstrangs drei Datenklassen. Die when-Anweisung verarbeitet nur zwei davon – Wenn Ihr Code einen Hybridantrieb erhält, wird ein falscher Wert zurückgegeben.

Der Kotlin-Compiler macht Sie nun auf dieses Problem aufmerksam. In Kotlin 1.7 führt eine nicht erschöpfende Abdeckung aller Möglichkeiten zu einem Kompilierungsfehler.

Aussetzen von Typtransformationen

Transformationen von regulären zu aussetzenden Typen haben durch automatische Compiler-Konvertierungen stabilisiert. Der Compiler erstellt die Konvertierung automatisch, wenn Sie einen regulären Typausdruck an einen Kontext übergeben, in dem ein anhaltender Typ erwartet wird.

Dies ermöglicht Code wie den folgenden:

fun createUser(name: String) { //… }   flow.collect(::createUser)   val createUserFunction = ::createUser flow.collect(createUserFunction)

Dieser Code wurde verwendet, um beim zweiten Aufruf von flow.collect() zu unterbrechen. Die Variable createUserFunction bezieht sich auf die reguläre Funktionsdefinition, nicht auf die Unterbrechung, die beim ersten Aufruf erstellt wurde. Kotlin behandelt dies jetzt, indem es eine ausgesetzte Version erstellt, wenn der empfangende Kontext dies erfordert.

Aussetzende Funktionen werden jetzt auch als Supertypen unterstützt. Auf diese Weise können Sie Klassen übergeben, die anhaltende Funktionstypen implementieren, wo immer eine Referenz für eine anhaltende Funktion derzeit unterstützt wird.

class ImplementsSuspendingFunctionalType : suspend () -> Einheit { überschreiben Spaß aussetzen invoke() { /* … */} } Werbung

Die Aussetzung () -> Die Unit-Schnittstelle wird genauso implementiert, wie Sie es bereits verwenden können () -> Einheit für nicht hängende Typen.

Code-Coverage-Scanner

Kotlin verfügt jetzt über ein offizielles Tool zum Scannen der Codeabdeckung. Kover ist ein Gradle-Plugin, das die Abdeckungsstatistiken von Tests für Kotlin JVM-, Multiplatform- und gemischte Java-Projekte sammelt. Es kann Berichte im HTML- und XML-Format erstellen.

Kover bietet volle Kompatibilität mit der Kotlin-Sprache und ihrer Gradle-Toolchain. Obwohl einige Tools von Drittanbietern bereits Abdeckungswerte bereitstellen können, existieren sie außerhalb des Ökosystems und haben nicht immer Einblick in jede Aufgabe. Kover bietet einen vollständig integrierten Ansatz. Die Entwicklung wird fortgesetzt, wobei diese erste Version als experimentell gekennzeichnet ist.

Um Kover zu aktivieren, fügen Sie Ihrer Build-Datei der obersten Ebene die folgenden Zeilen hinzu:

plugins { id(“org.jetbrains.kotlinx.kover “) Version “0.4.2” }

Kover wird jetzt als Teil Ihrer Gradle-Builds ausgeführt.

Standardbibliothekserweiterungen

Da sind ein paar bemerkenswerte Änderungen an der Standardbibliothek, einschließlich der Förderung mehrerer Betafunktionen auf Stable:

readln() und readlnOrNull()

Diese beiden neuen Funktionen lesen eine Zeile aus dem Standard-Eingabestream und geben sie zurück. Ersteres wird ausgelöst, wenn die EOF-Markierung erreicht wurde, während letzteres null zurückgibt.

typeOf()

Mit der typeOf()-Funktion können Sie den tatsächlichen Typ bestimmen eines verdinglichten Typs, normalerweise als T ausgedrückt, zur Laufzeit.

Inline-Spaß <reified T> getTypeString() : Zeichenfolge { Werttyp = typeOf<T>() Rückgabetyp.toString() }

Collection Builders

Mit den neuen Builder-Funktionen können Sie ganz einfach Sammlungen aus verschiedenen Werten erstellen. Sie können Karten, Listen und Sets mit erstklassigen Funktionen zu neuen Sammlungen kombinieren:

val Fruits = listOf("Apfel", "Banane"); val veg = listOf(”Karotte”, “Kohl”);   val Lebensmittel = buildList { ("Milch"&41; addAll(Früchte) addAll(veg) }   //["Milch", "Apfel", "Banane", "Karotte", "Kohl"]

Dauer-Werte

Die Dauer-Klasse für die Darstellung von Zeitwerten wurde auf stabil hochgestuft. Es bietet einen integrierten Typ zum Speichern einer Zeitdauer in Ihrem Code. Die Klasse verfügt über Methoden, die einfache Konvertierungen zwischen Einheiten ermöglichen:

//Gibt 1.0 aus println(60.toDuration(DurationUnit.SECONDS).inMinutes);

Weitere Änderungen an der Standardbibliothek

Integers haben neue RotateLeft()- und RotateRight()-Funktionen. Diese drehen die binäre Darstellung der Zahl um eine angegebene Anzahl von Bits in die angegebenen Richtungen. Regexe erhalten Sequenzaufteilungsfunktionen und konsistentes Verhalten für replace() und replaceFirst() in Java- und JavaScript-Umgebungen.

Einige vorhandene Funktionen sind veraltet. Die Funktionen concat(), match() und match() für Strings sowie die Funktion sort() für Arrays geben jetzt Warnungen aus. Ihre Funktionalität wird bereits durch alternative Optionen abgedeckt.

Andere Änderungen

Kotlin 1.6 fügt einige Verbesserungen des Ökosystems und der Lebensqualität hinzu. Dazu gehört die Unterstützung für Xcode 13 und die Möglichkeit, Windows-Builds auf jeder Plattform zu kompilieren. Wenn Sie auf mingwX64 oder mingwX86 für Windows abzielen, können Sie jetzt von jedem System aus kompilieren, das die Kotlin-/Native-Entwicklung unterstützt.

Werbung

Verbesserungen an Compiler-Caches für Linux- und iOS-Builds haben die typischen Build-Zeiten nach der ersten Ausführung halbiert. Updates der Kotlin-Abhängigkeitskette reduzieren die Festplattennutzung erheblich. Der Wechsel zu LLVM 11.1 hat die macOS-Version von 1200 MB auf etwa 300 MB reduziert.

Wenn Sie Kotlin-JavaScript verwenden, können Sie jetzt die automatischen Downloads von Node.js und Yarn während des Build-Prozesses deaktivieren . Dies ist nützlich, wenn Sie Code in einer vorkonfigurierten Umgebung kompilieren, in der diese Abhängigkeiten bereits auf dem Host installiert sind.

Zusammenfassung

Kotlin 1.6 ist eine gesunde Version mit neuen experimentellen Funktionen, die den Weg nach vorne ebnen und einer guten Liste von Sprach- und Standardbibliotheksänderungen, die Sie heute verwenden können. Es gab auch Verbesserungen bei der Interoperabilität zwischen Kotlin-Varianten, sodass sich mehr Code gleich verhält, egal ob er für JVM, Native oder JavaScript kompiliert wurde.

Der Meilenstein 1.6 sieht auch die Betreuer von Kotlin bieten einen verlängerten Supportzeitraum für ältere API-Versionen an. Drei Vorgängerversionen werden nun in einem fortlaufenden Rhythmus unterstützt. Das bedeutet, dass Sie derzeit gegen die Kotlin-Versionen 1.3 bis 1.6 entwickeln können, sodass Sie zwischen den Veröffentlichungen mehr Zeit für Upgrades haben.

Sie können noch heute zu Kotlin 1.6 wechseln, indem Sie Ihre Version von IntelliJ IDEA, Android Studio, Xcode aktualisieren , oder den Kotlin-CLI-Compiler. Es lohnt sich, zuerst den Kompatibilitätsleitfaden zu lesen, um sicherzustellen, dass Sie alle zuvor gemeldeten Einstellungen behoben haben, die in 1.6 Warnungen oder Fehler auslösen.