So scheitern Sie kläglich von der Java- zur Kotlin-Migration in einer Android-Anwendung

So scheitern Sie kläglich von der Java- zur Kotlin-Migration in einer Android-Anwendung


Seit Google die offizielle Unterstützung für Kotlin für Android angekündigt hat, möchten immer mehr Entwickler diese in ihren neuen und bestehenden Projekten verwenden. Da ich auch ein großer Fan von Kotlin bin, konnte ich es kaum erwarten, Kotlin in meinem Arbeitsprojekt verwenden zu können. Am Ende ist Kotlin voll kompatibel mit Java und alle Entwickler sind begeistert davon. Was könnte also schief gehen?


Nun, eigentlich kann viel schief gehen. Ich habe nur Angst, dass auf der offiziellen Android-Seite " Erste Schritte mit Kotlin " steht, dass Sie, wenn Sie eine vorhandene Anwendung auf Kotlin portieren möchten, nur mit dem Schreiben von Komponententests beginnen müssen. Nach ein wenig Erfahrung mit dieser Sprache sollten Sie dies tun Schreiben Sie neuen Code in Kotlin, und vorhandener Java-Code ist einfach zu konvertieren.


In diesem Artikel werde ich Ihnen sagen, was passieren würde, wenn ich mich entschließen würde, diese Strategie sofort auf dem Produkt zu verfolgen und sie nicht auf meinem kleinen Projekt auszuprobieren.


Lerne mein kleines Projekt kennen


Ich hatte ein Projekt, das ich vor über einem Jahr in Java erstellt hatte, und ich musste es ein wenig ändern und einen neuen Bildschirm hinzufügen. Ich dachte, dies wäre eine großartige Gelegenheit, um zu überprüfen, ob die Migration eines bestehenden Projekts nach Kotlin wirklich sehr einfach ist, wie jeder sagt. Basierend auf den Empfehlungen der offiziellen Dokumentation begann ich damit, Unit-Tests auf Kotlin zu schreiben. Ich habe auch neue Klassen in Kotlin geschrieben und einige bestehende konvertiert. Alles schien wunderbar zu sein, aber nach einer Weile entdeckte ich ein unangenehmes Problem.


Kotlin + Lombok = :(


In meiner Anwendung habe ich die Lombok-Bibliothek verwendet, um Getter und Setter zu generieren. Lombok ist ein Annotationsprozessor für Javac. Leider verwendet der Kotlin-Compiler Javac, ohne Anmerkungen zu verarbeiten [Quelle] . Dies bedeutet, dass mit Lombok erstellte Methoden in Kotlin nicht verfügbar sind:


Mit Lombok erstellte Methoden sind in Kotlin nicht verfügbar


Aber Sie können sagen: „Nun, es wird nicht sehr cool sein, aber im Prinzip können Sie Getter und Setter manuell für die Felder erstellen, die im Kotlin-Code benötigt werden. Am Ende müssen Sie dies nicht sofort im gesamten Projekt tun. "


Ich dachte genauso. Ich bin jedoch auf ein echtes Problem gestoßen, als ich der Anwendung einen neuen Bildschirm hinzufügen wollte.


Kotlin + Lombok + Dolch 2 =: (((


Meine Anwendung verwendet Dolch 2, um Abhängigkeiten einzufügen. Beim Erstellen eines neuen Bildschirms erstelle ich normalerweise eine MVP-Struktur: Aktivität, Präsentator, Komponente, Modul und Vertrag. Alle Abhängigkeiten für den Präsentator werden mit Dagger implementiert. Die Aktivität ruft DaggerSomeComponent.builder().(...).build().inject(this) auf, um dem Präsentator die erforderlichen Abhängigkeiten zu injizieren.


Die Verwendung von Dolch 2 mit Kotlin ist kein Problem. Kurz zuvor müssen Sie das kapt-Plugin anwenden, das die erforderlichen selbst generierten Klassen für Dagger erstellt.


Und hier beginnt alles auseinander zu fallen


Ohne das kapt-Plugin könnte ich die generierten Dagger-Klassen nicht in Kotlin-Dateien verwenden. Aber nachdem ich dieses Plugin hinzugefügt habe, sind alle von Lombok erstellten Methoden verschwunden!


Vor dem Anwenden des kapt-Plugins :


Vor dem Anwenden des kapt Plugins


Nach dem Anwenden des kapt Plugins :


Nach dem Anwenden des kapt Plugins


Und leider gibt es keine Lösung für dieses Problem. Sie können entweder nur das Kapt-Plugin oder nur Lombok verwenden . Glücklicherweise habe ich, da es nur mein kleines Projekt war, Lombok einfach gelöscht und die Getter und Setter selbst geschrieben. In diesem Projekt wurden jedoch nur etwa 50 Methoden generiert. In dem Projekt, das wir bei der Arbeit unterstützen, haben wir ungefähr tausend davon . Das Entfernen von Lombok aus dieser Anwendung ist einfach nicht möglich.


Es ist auch offensichtlich, dass das Aufgeben des kapt-Plugins nicht der Ausweg ist. Ohne sie können Sie Kotlin nicht in Klassen verwenden, in denen Dolch verwendet wird. In meinem Fall müsste ich Aktivität, Komponente und Modul in Java implementieren, und nur Vertrag und Präsentator könnten in Kotlin geschrieben werden. Das Mischen von Java- und Kotlin-Dateien ist definitiv nicht großartig. Anstelle eines reibungslosen Übergangs von Java zu Kotlin würden Sie einfach ein großes Durcheinander verursachen.


So würde diese schreckliche polyglotte MVP-Struktur ohne ein kapt-Plugin aussehen:


Schreckliche polyglotte MVP-Struktur ohne Kapt-Plugin


Aber ich möchte trotzdem zu Kotlin wechseln. Was kann ich tun?


Eine Möglichkeit besteht darin , verschiedene Module zu verwenden . Kotlin sieht die von Lombok generierten Methoden nicht im Quellcode, sondern im Bytecode.


Persönlich scheint mir dies der am meisten bevorzugte Weg zu sein. Wenn Sie Kotlin für jede Funktion in separate abhängige Module einfügen, verringern Sie das Risiko solcher Kompatibilitätsprobleme, auf die ich gestoßen bin, oder komplexerer Probleme, die im offiziellen Handbuch aufgeführt sind .


Und das ist noch nicht alles. Das Mischen von Kotlin- und Java-Dateien ohne klare Trennung hat viele andere Nachteile. Dadurch können alle Entwickler, die mit Ihnen am Projekt arbeiten, beide Sprachen beherrschen. Dies verringert auch die Lesbarkeit des Codes und kann zu einer Verlängerung der Erstellungszeit führen [Quelle] .


Kurz


  • Von Lombok generierte Methoden sind in Kotlin nicht sichtbar.
  • mit dem kapt plugin bricht Lombok;
  • Ohne ein kapt-Plugin können Sie keine selbst generierten Klassen für Dagger in Kotlin verwenden. Dies bedeutet, dass Sie immer noch neuen Java-Code schreiben müssen.
  • Eine Möglichkeit, dieses Problem zu lösen, besteht darin, Kotlin in separate Module zu unterteilen.
  • Das Mischen von Kotlin- und Java-Dateien in großen Projekten ohne klare Trennung kann zu unerwarteten Kompatibilitätsproblemen führen.

Source: https://habr.com/ru/post/de421871/


All Articles