[JAVA] Kotlin 1.3.50 wurde veröffentlicht !!

https___qiita-image-store.s3.amazonaws.com_0_79387_fcbcb29e-7cfd-9fb6-d0d1-02a1dd256a4c.png https://kotlinlang.org/

2019/8/22 Kotlin 1.3.50 wurde veröffentlicht: tada :: tada :: tada: Kotlin 1.3.50 released

zusammen Kotlin coroutiees1.3.0 wurde ebenfalls veröffentlicht! (Ich werde dieses Mal nicht anfassen ..)

Kotlin Fest 2019 wurde ebenfalls kurz vor der Veranstaltung veröffentlicht! (Diejenigen, die die Bühne betraten, hatten Schwierigkeiten, die Materialien so zu korrigieren, dass sie kurz vor 1.3.50 entsprachen.)

Ich habe den unten abgekürzten Release-Blog übersetzt. Ich bin nicht sehr daran gewöhnt, daher tut es mir leid, wenn es eine Fehlübersetzung gibt: bow:

: star2: Zusammenfassung

Null-Check-Optimierung für Kotlin 1.4

Kotlin reduziert die Möglichkeit von NullPointerExceptions durch die Unterstützung von nullbaren Typen, aber es ist unmöglich, NPE aufgrund seiner Interoperabilität mit Java-Code vollständig zu vermeiden. Um Entwicklern zu helfen, die Ursache der Null-Möglichkeit besser zu verstehen, löst der Kotlin-Compiler verschiedene Arten von Laufzeitausnahmen mit einer eindeutigen Fehlermeldung anstelle einer reinen NPE aus. Dieser Ansatz erwies sich als problematisch. Es beeinträchtigt die Optimierung von Nullprüfungen, die entweder vom Kotlin-Compiler oder von verschiedenen Arten von Bytecode-Verarbeitungstools wie dem Android R8 Optimizer durchgeführt werden können.

Um dies zu beheben, lösen alle Laufzeit-Nullprüfungen ab Kotlin 1.4 java.lang.NullPointerException anstelle von KotlinNullPointerException, IllegalStateException, IllegalArgumentException und TypeCastException aus. Es gilt für:

--Überprüfen Sie die Präambelparameter für Nulloperatoren und Methoden

Aus Entwicklersicht ändert sich nicht viel. Der Kotlin-Code löst eine Ausnahme mit derselben Fehlermeldung wie zuvor aus. Die Arten von Ausnahmen ändern sich, die übergebenen Informationen jedoch nicht. Der folgende Code löst derzeit eine IllegalStateException mit der Fehlermeldung "avaCode.getNull () darf nicht null sein" aus.

fun main() {
    duplicate(JavaCode.getNull())  // 1
}

fun duplicate(s: String) = s + s
public class JavaCode {
    public static String getNull() { return null; }
}

Eine spezielle Prüfung, die eine Ausnahme auslöst, wenn JavaCode.getNull () null speichert, funktioniert. Ab Kotlin 1.4 löst dieser Code eine NullPointerException anstelle der Fehlermeldung "JavaCode.getNull () darf nicht null sein" aus.

Diese Änderung kann Nullprüfungsiterationen reduzieren und die Anzahl der im Bytecode vorhandenen Nullprüfungen verringern.

Änderungen in der Standardbibliothek

: information_source: Alle neu hinzugefügten Funktionen sind "experimentelle" Funktionen

Duration and time measurement API Eine Vorschau-Version der neuen API zur Messung von Dauer und Zeit ist verfügbar. Die Dauer kann in verschiedenen Einheiten wie Sekunden, Millisekunden, Nanosekunden usw. gemessen werden. Verschiedene Einheiten sind verwirrend und verursachen Fehler. Wenn die API erwartet, dass ein Zeitraum als Long-like-Primitivwert gespeichert wird, kann das System vom Typ Unit dies nicht verhindern. Das Erstellen einer regulären Klasse und das Speichern des Zeitraums lösen dieses Problem, verursachen jedoch zusätzliche Zuordnungsprobleme.

Inline-Klassen bieten eine ausgefeilte Lösung für die oben genannten Probleme. Es bietet sowohl eine Typsystemgarantie als auch einen nicht zugewiesenen Ansatz. Die API kann jetzt den Typ Dauer verwenden, bei dem alle Clients die Zeit in der gewünschten Einheit explizit angeben müssen. Die Dauer wird als Inline-Klasse deklariert, sodass intern keine zusätzlichen Zuordnungen vorgenommen werden.

import kotlinx.coroutines.delay
import kotlin.time.*

@ExperimentalTime
suspend fun greetAfterTimeout(duration: Duration) {
    delay(duration.toLongMilliseconds())
    println("Hi!")
}

@UseExperimental(ExperimentalTime::class)
suspend fun main() {
    greetAfterTimeout(100.milliseconds)
    greetAfterTimeout(1.seconds)
}

Diese Version unterstützt Mono Clock, eine monotone Uhr. Der empfohlene Ansatz zur Messung der Dauer von einem bestimmten Punkt im Programm aus ist die Verwendung einer systemzeitunabhängigen monotonen Uhr. Die Systemzeit kann sich extern ändern, was zu falschem Verhalten führen kann. Die monotone Uhr kann nur die Zeitdifferenz zwischen bestimmten Zeitpunkten messen, kennt jedoch nicht die "aktuelle Zeit".

Die Clock-Schnittstelle bietet eine gemeinsame API zum Messen von Zeitintervallen. MonoClock ist ein Objekt, das Clock implementiert. Bietet eine Standardquelle für monotone Zeit auf verschiedenen Plattformen.

Markieren Sie bei Verwendung der Clock-Schnittstelle explizit die Startzeit der Aktion und später die verstrichene Zeit ab dem Startpunkt. Dies ist besonders nützlich, um Zeitmessungen mit einer Vielzahl von Funktionen zu starten und zu beenden.

import kotlin.time.*

@UseExperimental(ExperimentalTime::class)
fun main() {
    val clock = MonoClock
    val mark = clock.markNow() // might be inside the first function
    Thread.sleep(10)           // action
    println(mark.elapsedNow()) // might be inside the second function
}

Mit der Funktion MeasureTimedValue können Sie die Dauer einer bestimmten Aktion messen und das Ergebnis zusammen mit der Dauer des verstrichenen Zeitintervalls abrufen. Messen Sie die verstrichene Zeit mit MonoClock.

import kotlin.time.*

@UseExperimental(ExperimentalTime::class)
fun main() {
    val (value, duration) = measureTimedValue {
        Thread.sleep(100)
        42
    }
    println(value)     // 42
    println(duration)  // e.g. 103 ms
}

Weitere Informationen zur Implementierung der Duration-Klasse sowie der Clock-Schnittstelle und der MonoClock-Implementierung auf verschiedenen Plattformen finden Sie unter KEEP. Bitte sehen Sie .md). Bitte beachten Sie, dass diese API experimentell ist und sich aufgrund von Rückmeldungen ändern kann.

Bitmanipulationsfunktion

Eine API zur Bitmanipulation wurde experimentell in der Standardbibliothek implementiert.

@UseExperimental(ExperimentalStdlibApi::class)
fun main() {
    val number = "1010000".toInt(radix = 2)
    println(number.countOneBits())
    println(number.countTrailingZeroBits())
    println(number.takeHighestOneBit().toString(2))
    println(number.rotateRight(3).toString(2))
    println(number.rotateLeft(3).toString(2))
}

IntelliJ IDEA-Unterstützung

Verbesserung des Java-zu-Kotlin-Konverters

Wir planen, den Java-Kotlin-Konverter zu verbessern, um die Menge an Code zu minimieren, die nach der Konvertierung manuell geändert wird. Die meisten aktuellen Konverter generieren nicht nullbare Typen, sodass Probleme mit der Nullbarkeit später manuell behoben werden müssen. In vielen Fällen kann eine Nichtübereinstimmung der Nullbarkeit später zu Laufzeitfehlern führen.

Eine neue und verbesserte Version des Java-zu-Kotlin-Konverters versucht, die Nullfähigkeit basierend auf der Verwendung von Java-Typen in Ihrem Code genauer zu erraten. Es gibt kein Ziel, 100% fehlerfreien Code zu schreiben. Ziel ist es, die Anzahl der Kompilierungsfehler zu reduzieren und die Arbeit mit dem generierten Kotlin-Code zu vereinfachen. Der neue Konverter behebt auch viele andere bekannte Fehler. Beispielsweise werden implizite Java-Typumwandlungen jetzt korrekt behandelt.

In Zukunft wird der neue Konverter der Standardkonverter sein. Verfügbar in der Vorschau in dieser Version. Geben Sie zum Aktivieren in den Einstellungen das Flag "Neues J2K (experimentell) verwenden" an.

Verbessertes Debugging

Die Auswahl der angezeigten Variablen in der Kotlin-Ansicht „Variablen“ wurde verbessert. Aufgrund der großen Menge zusätzlicher technischer Informationen im Bytecode werden in der Ansicht „Variablen“ nur die relevanten Variablen hervorgehoben. Das Setzen von Haltepunkten innerhalb des Lambda (Inline oder Nicht-Inline) funktioniert jetzt besser. Die lokalen Variablen im Lambda und die Parameter der Variablen und externen Funktionen, die aus dem externen Kontext erfasst wurden, werden korrekt angezeigt.

image.png

Falls gewünscht, können Sie am Ende der Funktion einen Haltepunkt festlegen.

image.png

evaluate_expression2.gif

Die Unterstützung für die Funktion "Ausdrücke auswerten" wurde in vielen wichtigen Sprachfunktionen verbessert, z. B. in lokalen Erweiterungen und Accessoren für Eigenschaften von Mitgliedererweiterungen. Außerdem können Sie jetzt Variablen mit der Funktion "Ausdruck auswerten" ändern.

Neue Absicht und Inspektion

Neue Absichten und Inspektionen wurden hinzugefügt. Eines der Ziele ist es, Ihnen zu helfen, wie man idiomatischen Kotlin-Code schreibt. Wir empfehlen beispielsweise, die Eigenschaft indexes zu verwenden, anstatt den Indexbereich manuell zu erstellen. indices-gif.gif

Wenn Sie keine Indizes verwenden, können Schleifen automatisch durch Elemente für Schleifen ersetzt werden.

Kotlin/JS

Dukat Sie können TypeScript-Deklarationsdateien (.d.ts) automatisch in externe Kotlin-Deklarationen konvertieren (ersetzt das Befehlszeilentool ts2kt). Kotlin macht es bequem, die JavaScript-Ökosystembibliotheken typsicher zu verwenden, da die Notwendigkeit, Wrapper für JS-Bibliotheken manuell zu schreiben, erheblich reduziert wird.

Kotlin / JS wird die Dukat-Integration des Gradle-Projekts experimentell unterstützen. Durch Ausführen einer Build-Aufgabe in Gradle wird automatisch ein typsicherer Wrapper für die npm-Abhängigkeit generiert, der von Kotlin aus verwendet werden kann. kotlin-dukat-video.gif

Kotlin/Native --Kotlin / Native Version vereinheitlicht mit Kotlin

Multi-Plattform-Projekt

Die Java-Kompilierung kann jetzt in Kotlin / JVM-Ziele für Projekte mit mehreren Plattformen aufgenommen werden, indem die neu hinzugefügte Funktion withJava () in DSL aufgerufen wird. Konfigurieren Sie das Java-Plug-In so, dass standardmäßig die Testpfade src / Main / java und src / Test / Java verwendet werden.

plugins { 
    kotlin("multiplatform") version "1.3.50"
}
kotlin {
    jvm {
        withJava()
    }
}

Kotlins Assistent für neue Projekte generiert jetzt ein Gradle Kotlin DSL für neue Projekte.

Das Debuggen von Kotlin / Native-Code in IntelliJ IDEA Ultimate wird jetzt ebenfalls unterstützt. Native Debug for IntelliJ IDEA Ultimate

image.png

Scripting Es wurden mehrere Funktionen hinzugefügt, um die Skript- und REPL-Unterstützung zu verbessern. Eine Bibliothek, die den Standardwert JSR-223 implementiert, indem Sie einfach kotlin-scripting-jsr223 als Abhängigkeit hinzufügen und javax verwenden Es wird verfügbar sein.

Über die JSR-223-API festgelegte Eigenschaften können jetzt über Skripte als reguläre Kotlin-Eigenschaften aufgerufen werden (zuvor mussten Sie eine Bindungszuordnung verwenden).

Referenz: Java JSR-223-Implementierung ausprobieren

val engine = ScriptEngineManager().getEngineByExtension("kts")!!
engine.put("z", 42)
engine.eval("""println("answer = $z")""")

Zusätzlich zu Anmerkungen wie Repository und DependsOn zum Auflösen von Abhängigkeiten unterstützen wir jetzt @ Import-Anmerkungen, die den Skript-Compiler anweisen, ein anderes Skript in das aktuelle Skript zu "importieren".

// common.main.kts:
val foo = "common foo"
// script.main.kts:
@file:Import("common.main.kts")
val bar = "bar with $foo"

Am Ende

Kotlin 1.4 ist in Sicht. Kotlin / JS und Kotlin / Native werden ebenfalls aktiv verbessert, und ich freue mich darauf zu sehen, wie Kotlin in Zukunft wachsen wird. Ich werde weiterhin zuschauen: Sonnenbrille:

Dieser Artikel ist auch kompatibel mit Kotlin 1.3.50! Asynchrone Verarbeitung der HTTP-Kommunikation mit Coroutinen (Async, Await) von Android + Kotlin 1.3

Recommended Posts

Kotlin 1.3.50 wurde veröffentlicht !!
Macchinetta wurde veröffentlicht
Resilience4j-Dokument Die japanische Übersetzung (inoffiziell) wurde veröffentlicht
Java SE 13 (JSR388) wurde veröffentlicht, also habe ich es versucht
Spring 5 & Spring Boot 2 Einführung für Anfänger wurde veröffentlicht
Kotlin hat keinen ternären Operator (bedingter Operator)
Die Methode JacocoReportBase.setClassDirectories (FileCollection) ist veraltet.