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
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.
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".
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]
[Probe nach Konvertierung]
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.
Sobald es als Nullable und Early Return usw. behandelt wird, kann es ab der nächsten Zeile als NonNull behandelt werden.
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);
Basierend auf den oben genannten Vorsichtsmaßnahmen sollten Sie vor der Konvertierung einige Dinge tun.
Sowohl Kotlin Official als auch Android Official verfügen über eine Interoperabilitätsdokumentation mit Java.
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).
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);
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.
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
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.
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.
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 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)
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"
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.
↑ Laufzeitfehler in meinem Robo-Test gefunden. Ein Fehler, der vor der Initialisierung auf lateinit zugegriffen hat.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.