Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin

Einführung

Führen Sie während der 10 aufeinander folgenden Feiertage eine stetige Konvertierung durch Ich habe meine eigene Java Android-Anwendung (ca. 300 Dateien) zu vollem Kotlin gemacht.

↓ Kotlin 100% Diagramm スクリーンショット 2019-05-03 2.11.20.png

Kolin First wurde bei Google I / O 2019 angekündigt, das kurz nach den 10. aufeinander folgenden Feiertagen stattfand. Ich werde mehr Möglichkeiten haben, von Java nach Kotlin zu konvertieren, also werde ich zusammenfassen, worauf ich gestoßen bin und wie ich es vermeiden kann.

Die Umgebung ist Android Studio 3.4.

Konvertierungsmethode

Ich bin sicher, Sie werden alles von Hand erledigen, aber Android Studio bietet Konvertierungsbefehle. "Menü> Code> Java-Datei in Kotlin-Datei konvertieren" Die Verknüpfung lautet "Umschalt + Option + Befehl + k".

スクリーンショット 2019-05-14 7.58.17.png

Hinweise zum Kotlin-Konvertierungsbefehl

Kommentar

Die Kommentare behinderten manchmal die Konvertierung. Der auskommentierte Teil bleibt nach der Kotlin-Konvertierung Java. Kotlin setzt außerdem voraus, dass Sie die gleiche Anzahl von "/ " zum Öffnen von Kommentaren und " /" zum Schließen von Kommentaren haben.

[Probe vor der Konvertierung] スクリーンショット 2019-05-13 22.33.11.png

[Probe nach Konvertierung]

スクリーンショット 2019-05-13 22.32.52.png

Nullable / NonNull ist nicht eindeutig

Kotlin ist eine NullSafe-Sprachspezifikation. Wenn also Nullable / NonNull auf der Java-Seite nicht eindeutig ist, Es wird als Plattformtyp behandelt (ein Typ, der Nullable oder NonNull sein kann). Es ist sicherer, es als Nullable zu behandeln, es sei denn, NonNull ist deterministisch.

Der Code, der tatsächlich einen Laufzeitfehler verursacht hat, ist unten aufgeführt. Diejenigen mit ! Nach der Variablen sind vom Plattformtyp und können im Code als NonNull behandelt werden. Zur Laufzeit kann Null eingehen und ein Fehler auftreten. スクリーンショット 2019-05-09 3.47.20.png

Sobald es als Nullable und Early Return usw. behandelt wird, kann es ab der nächsten Zeile als NonNull behandelt werden. スクリーンショット 2019-05-09 3.47.38.png

Beim Definieren einer Unterklasse einer in Java in Kotlin definierten Klasse

Für Nullable / NonNull bei Verwendung des Kotlin-Konvertierungsbefehls Insbesondere waren die folgenden Ausnahmen wahrscheinlich.

Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: 

Dies ist eine Ausnahme, die auftritt, wenn die Oberklasse Java und die Unterklasse Kotlin ist und Nicht-Null und Null falsch behandelt werden. In den folgenden Fällen, die von AppCompatActivity erben, tritt beispielsweise eine Ausnahme auf. Dies ist ein Laufzeitfehler, sodass der Code erfolgreich erstellt werden kann.

class MainActivity : AppCompatActivity() {
:
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        :

Der richtige Code lautet "Bundle?" Als Argumenttyp, wie unten gezeigt.

class MainActivity : AppCompatActivity() {
:
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        :

Dies ist schwer zu finden, ohne den Code auf der Seite der Oberklasse zu lesen. Wenn ich den eigentlichen Code lese, wird das Bundle mit "@ Nullable" versehen Sie können sehen, dass "Bundle?" Anstelle von "Bundle" korrekt ist.

androidx-appcompat:[email protected]


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        final AppCompatDelegate delegate = getDelegate();
        delegate.installViewFactory();
        delegate.onCreate(savedInstanceState);

Gute Punkte vor der Kotlin-Konvertierung

Basierend auf den oben genannten Vorsichtsmaßnahmen sollten Sie vor der Konvertierung einige Dinge tun.

Lesen Sie die Dokumentation zur Kotlin-Konvertierung

Sowohl Kotlin Official als auch Android Official verfügen über eine Interoperabilitätsdokumentation mit Java.

Nutzen Sie nicht null Anmerkungen

Es ist besser, NonNull zum Zeitpunkt von Java so weit wie möglich zu unterscheiden. Gemäß der Kotlin-Dokumentation werden die folgenden Anmerkungen unterstützt.

https://kotlinlang.org/docs/reference/java-interop.html

JetBrains (@Nullable and @NotNull from the org.jetbrains.annotations package) Android (com.android.annotations and android.support.annotations) JSR-305 (javax.annotation, more details below) FindBugs (edu.umd.cs.findbugs.annotations) Eclipse (org.eclipse.jdt.annotation) Lombok (lombok.NonNull).

Kompatibel mit Android X.

Wenn Sie die alte Support-Bibliothek verwenden, ist es besser, nach der Migration auf Android X zu konvertieren. Android X hat ein geringeres Risiko für die Konvertierung in Kotlin, da NonNull und Nullable klar voneinander unterschieden werden. Unten finden Sie einen Vergleich des Java-Codes für RecyclerView.

Alte Support-Bibliothek RecyclerView https://android.googlesource.com/platform/frameworks/support/+/121ba96/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java#5143

        public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);

RecyclerView in der AndroidX-Bibliothek https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java#6888

        @NonNull
        public abstract VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType);

Garantierter Betrieb durch Unit Test

Wenn Sie zum Zeitpunkt von Java einen Komponententest hinzufügen, ist es einfach, den Vorgang nach der Kotlin-Konvertierung zu überprüfen. Es wird empfohlen, einen Komponententest hinzuzufügen, da dies das Minimum ist.

Nutzen Sie Lint

Wenn Sie unter "Editor"> "Inspektion" nach "Interop" usw. suchen, wird der Lint des interoperablen Systems angezeigt, der für die Kotlin-Konvertierung verwendet werden kann. Wenn diese Option aktiviert ist, wird gefährlicher Code vor und nach der Konvertierung gewarnt.

https://developer.android.com/kotlin/interop#lint_checks https://developer.android.com/studio/write/lint?hl=ja

スクリーンショット 2019-05-13 23.04.38.png

Vermeiden Sie von Kotlin reservierte Wortvariablennamen

Von Kotlin reservierte Wörter wie is, object, when und get, set usw., die im internen Java-Code verwendet werden, sollten im Voraus umbenannt werden. Sie können Kotlin verwenden, indem Sie es in Anführungszeichen setzen, aber Sie sollten es vermeiden.

Gute Punkte nach der Kotlin-Konvertierung

Der vom Kotlin-Konvertierungsbefehl generierte Kotlin-Code ist schwer zu sagen, dass er Kotlin verwendet. Zumindest erfahren Sie hier, wie Sie es bis zu einem gewissen Grad ohne Vorwarnung sicher machen können.

Betrachten Sie eine Entpackungsmethode vom Typ Nullable

Der Code nach dem Konvertierungsbefehl verwendet grundsätzlich !!, um ihn in NonNull zu entpacken. Überlegen Sie, ob Sie sicher mit "?." Usw. auspacken können.

Codebeispiel unmittelbar nach der Kotlin-Konvertierung

    var webView: WebView? = null

    fun load() {
        if (webView != null) {
            webView!!.load()
        }
        :

Beispiel für die Verwendung von "?"

    var webView: WebView? = null

    fun load() {
        webView?.load()
        :

Überlegen Sie, ob der Umgang mit var angemessen ist

Überlegen Sie, ob nullfähige Eigenschaften verwendet werden können, z. B. "lateinit" und "by faul". Wenn Sie andere als "init" wie "Activity # onCreate" für View initialisieren möchten, können Sie "lateinit" verwenden, um es als eine Eigenschaft von NonNull zu behandeln.

    private var mRecyclerView: RecyclerView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
    :
        mRecyclerView = findViewById(R.id.recycler_view)
    private lateinit var mRecyclerView: RecyclerView

    override fun onCreate(savedInstanceState: Bundle?) {
    :
        mRecyclerView = findViewById(R.id.recycler_view)

Überlegen Sie, ob der konstante Wert ein konstanter Wert sein kann

In Java werden statische Endkonstanten im Code nach dem Kotlin-Konvertierungsbefehl als Wert behandelt. Überlegen Sie, ob es sich um einen const-Wert handeln kann (normalerweise fügen Sie const hinzu, wenn Sie Lint folgen).

    companion object {
        private val TAG = "MainActivity"
    companion object {
        private const val TAG = "MainActivity"

Verwenden Sie zum Beenden den Firebase Robo Test

Selbst wenn Sie glauben, den Testcode richtig geschrieben zu haben, kann es nach der Konvertierung zu Fehlern kommen, die Ihre Erwartungen übertreffen. Sie können dies verhindern, indem Sie es von einem Dritten oder Robo testen lassen. Es gibt mehr Typen wie Nullable / NonNull / Platform und mehr Zustände wie lateinit vor der Initialisierung. Wir empfehlen, den Firebase Robo-Test zu verwenden, um "versehentliche Fehler" zu vermeiden.

スクリーンショット 2019-05-13 22.50.47.png ↑ Laufzeitfehler in meinem Robo-Test gefunden. Ein Fehler, der vor der Initialisierung auf lateinit zugegriffen hat.

Impressionen von 100% Kotlin

Kotlin selbst ist erfrischend, aber beim Überbrücken zwischen Kotlin und Java treten häufig Fehler auf. Es ist ein ziemlich heikler Weg, daher ist es besser, ihn im Voraus zu einem sicheren Java-Code zu machen. Nach der Konvertierung können Sie nützliche Funktionen wie Coroutine und Erweiterungsfunktionen verwenden, um Ihr Leben zu verändern.

Recommended Posts

Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin
Zusammenfassung der Punkte, über die ich mir bei der Migration von Java nach Kotlin Sorgen gemacht habe
[Java Silver] Zusammenfassung der Punkte im Zusammenhang mit Lambda-Ausdrücken
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
[Android] Konvertieren Sie Android Java-Code in Kotlin
[Java] Flache Kopie und tiefe Kopie beim Konvertieren eines Arrays in eine Liste
[Achtung !!] Vorsichtsmaßnahmen beim Konvertieren von Rails-Geräten und Anzeigen von Dateien in haml
[Android] Konvertieren Sie Map in JSON mit GSON mit Kotlin und Java
[Java Silver] Zusammenfassung der Zugriffsmodifikatorpunkte
[java] Zusammenfassung des Umgangs mit char
Konvertieren Sie alle Android-Apps (Java) in Kotlin
Zusammenfassung der Mittel, wenn Sie mit HTTP unter Android kommunizieren möchten
[Java] Tipps und Fehlerprobleme beim Konvertieren von Double zu Big Decimal
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
Vorsichtsmaßnahmen bei der Migration von VB6.0 auf JAVA
Zusammenfassung von Java Math.random und Import (Kalender)
Von Java nach C und von C nach Java in Android Studio
Punkte, auf die ich beim Erstellen einer Android-App gestoßen bin [Von Zeit zu Zeit aktualisiert]
Zusammenfassung beim Versuch, Solr in Java zu verwenden und eine Fehlermeldung zu erhalten (Solr 6.x)
Kotlin-Funktionen und Lambdas zum Senden an Java-Entwickler
[java] Zusammenfassung des Umgangs mit Zeichenketten
Dinge, die Sie beim Schreiben von Java beachten sollten
Java switch Anweisung und break, Kotlin beim Ausdruck ...
[Java] Persönliche Zusammenfassung der Klassen und Methoden (grundlegend)
[Java] Zusammenfassung, wie Lambda-Ausdrücke weggelassen werden
Zusammenfassung des Mooses beim Update von JMockit 1.4 auf 1.30
Was ich getan habe, als ich Java zu Kotlin konvertiert habe
Vorsichtsmaßnahmen beim Konvertieren von Dezimal in Binär
Technische Ursachen und Gegenmaßnahmen für Punkte, die von Android-Apps und Kotlin abhängig sind (3. Verarbeitung in Bezug auf Android-Bilder)
Java zu installieren ist nicht einfach! Zusammenfassung der Vorsichtsmaßnahmen, um auf einmal perfekt fertig zu werden
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
[Java] Arten von Kommentaren und wie man sie schreibt
Zusammenfassung des ToString-Verhaltens mit Java- und Groovy-Annotationen
Bitte beachten Sie die Aufteilung (Aufteilung) von Java Kotlin Int und Int
Der Vergleich von enum ist == und gleich ist gut [Java]
Java-Sprache aus der Sicht von Kotlin und C #
Zusammenfassung der Kenntnisse, die zum Bestehen von Java SE8 Silver erforderlich sind
Zusammenfassung der Java-Kommunikations-API (1) Verwendung von Socket
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Zusammenfassung der Java-Kommunikations-API (3) Verwendung von SocketChannel
Zusammenfassung der Java-Kommunikations-API (2) Verwendung von HttpUrlConnection
Zusammenfassung der Implementierung von Standardargumenten in Java
[Java] [Kotlin] Rufen Sie valueOf und Werte von Enum generisch auf
[Java] Dinge, die Sie bei der Ausgabe von FizzBuzz beachten sollten
Technische Ursachen und Gegenmaßnahmen für Punkte, die von Android-Apps und Kotlin abhängig sind (1. Verarbeitung des Android-Bildschirmübergangs (Fragment))
Zusammenfassung der Punkte, die Java-Programmierer beim ersten Lesen der Kotlin-Quelle als rutschig empfinden
Entwicklung von Android-Anwendungen (sowohl Java- als auch Kotlin-kompatibel) Wie implementieren Sie dies? ~ Button Edition ~
Entwicklung von Android-Anwendungen (sowohl Java- als auch Kotlin-kompatibel) Wie implementieren Sie dies? ~ Textausgabe ~
[Android / Kotlin] UI-Zusammenfassung
Technische Ursachen und Gegenmaßnahmen für Punkte, denen ich mit der Android-App und Kotlin verfallen war (2. Verarbeitung im Zusammenhang mit der Kamerafunktion von Android *)
Zusammenfassung der Java-Unterstützung 2018
Einstellungsmethode zum Verknüpfen von Java von Eclipse und Github / September 2017
Java, das Daten von Android zu Jetson Nanos ROS überspringt
[Java] Vorsichtsmaßnahmen beim Konvertieren von Argumentparametern variabler Länge in ein Array
Generieren und Ausführen der Jar-Datei der zum Paket gehörenden Java-Datei
Verwendung des mit Tensorflow 2.0 trainierten Modells mit Kotlin / Java
Siehe C ++ im Android Studio-Modul (Java / Kotlin)
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
Ich möchte eine Liste mit Kotlin und Java erstellen!