Résumé des bons points et des précautions lors de la conversion de l'application Java Android vers Kotlin

introduction

Effectuez une conversion régulière pendant les 10 jours fériés consécutifs J'ai créé ma propre application Java Android (environ 300 fichiers) en Kotlin complet.

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

Kolin First a été annoncé lors de Google I / O 2019, qui s'est tenu juste après le 10e jour férié consécutif. Je vais avoir plus d'opportunités de convertir de Java à Kotlin, je vais donc résumer ce sur quoi je suis tombé et comment l'éviter.

L'environnement est Android Studio 3.4.

Méthode de conversion

Je suis sûr que vous ferez tout cela à la main, mais Android Studio fournit des commandes de conversion. "Menu> Code> Convertir un fichier Java en fichier Kotlin" Le raccourci est "Maj + Option + Commande + k".

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

Remarques sur la commande de conversion Kotlin

commentaire

Les commentaires ont parfois gêné la conversion. La partie commentée reste Java après la conversion Kotlin. Kotlin exige également que vous ayez le même nombre de / * pour ouvrir les commentaires et * / pour fermer les commentaires.

[Échantillon avant conversion] スクリーンショット 2019-05-13 22.33.11.png

[Échantillon après conversion]

--La partie commentaire reste Java

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

Nullable / NonNull est ambigu

Kotlin est une spécification de langage NullSafe, donc si Nullable / NonNull est ambigu du côté Java, Il est traité comme un type de plate-forme (un type qui peut être Nullable ou NonNull). Il est plus sûr de le traiter comme Nullable sauf si NonNull est déterministe.

Le code qui a réellement causé une erreur d'exécution est ci-dessous. Ceux avec ! Après la variable sont de type plateforme et peuvent être traités comme NonNull dans le code. Au moment de l'exécution, Null peut arriver et une erreur peut se produire. スクリーンショット 2019-05-09 3.47.20.png

Une fois qu'il est traité comme Nullable et early return etc., il peut être traité comme NonNull à partir de la ligne suivante. スクリーンショット 2019-05-09 3.47.38.png

Lors de la définition d'une sous-classe d'une classe définie en Java dans Kotlin

Pour Nullable / NonNull, lors de l'utilisation de la commande de conversion Kotlin, En particulier, les exceptions suivantes étaient susceptibles de se produire.

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

Il s'agit d'une exception qui se produit lorsque la superclasse est Java et la sous-classe est Kotlin et que les valeurs non nulles et nulles sont mal gérées. Par exemple, une exception se produira dans les cas suivants qui héritent d'AppCompatActivity. Il s'agit d'une erreur d'exécution, le code peut donc être généré avec succès.

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

Le code correct doit avoir Bundle? Comme type d'argument, comme indiqué ci-dessous.

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

C'est difficile à trouver sans lire le code du côté des superclasses. Quand je lis le code réel, le Bundle a l'annotation @ Nullable. Vous pouvez voir que Bundle? Est correct au lieu de Bundle.

androidx-appcompat:[email protected]


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

Bons points à faire avant la conversion de Kotlin

Sur la base des précautions ci-dessus, voici certaines choses que vous devez faire avant la conversion.

Lisez la documentation sur la conversion Kotlin

Les officiels de Kotlin et d'Android ont tous deux une documentation sur l'interopérabilité avec Java.

Tirer parti des annotations NonNull

Il vaut mieux distinguer NonNull autant que possible au moment de Java. Selon la documentation Kotlin, les annotations suivantes sont prises en charge.

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).

Compatible avec Android X

Si vous utilisez l'ancienne bibliothèque de support, il est préférable de convertir après la migration vers Android X. Android X a moins de risque de conversion vers Kotlin car NonNull et Nullable sont clairement discriminés. Vous trouverez ci-dessous une comparaison du code Java pour RecyclerView.

Ancienne bibliothèque de support 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 dans la bibliothèque AndroidX 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);

Fonctionnement garanti par test unitaire

Si vous ajoutez un test unitaire au moment de Java, il est facile de vérifier le fonctionnement après la conversion Kotlin. Il est recommandé d'ajouter un test unitaire car c'est le minimum.

Profitez de Lint

Si vous recherchez "interopérabilité" dans Editer> Inspection, la charpie du système interopérable qui peut être utilisé pour la conversion Kotlin sera affichée. Si coché, le code dangereux sera averti avant et après la conversion.

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

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

Évitez les noms de variables de mots réservés Kotlin

Les mots réservés Kotlin tels que is, object, when, et get, set, etc. utilisés dans le code Java interne doivent être renommés à l'avance. Même Kotlin peut être utilisé en le mettant entre guillemets, mais il vaut mieux l'éviter.

Bons points à faire après la conversion de Kotlin

Le code Kotlin généré par la commande de conversion Kotlin est difficile à dire qu'il utilise Kotlin. À tout le moins, voici comment le rendre sûr dans une certaine mesure sans avertissement.

Considérez une méthode de dépliage de type Nullable

Le code après la commande de conversion utilise essentiellement !! pour le dérouler en NonNull. Demandez-vous si vous pouvez déballer en toute sécurité avec ? . etc.

Exemple de code immédiatement après la conversion Kotlin

    var webView: WebView? = null

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

Exemple d'utilisation de «?.»

    var webView: WebView? = null

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

Déterminez si la gestion de var est appropriée

Déterminez si les propriétés Nullable peuvent être utilisées, telles que «lateinit» et «by lazy». Si vous voulez initialiser autrement que ʻinit comme ʻActivity # onCreate lié à View, vous pouvez utiliser lateinit pour le gérer comme une propriété de NonNull.

    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)

Considérez si la constante val peut être une const val

En Java, les constantes finales statiques sont traitées comme val dans le code après la commande de conversion Kotlin. Considérez si cela peut être un const val (généralement, si vous suivez Lint, vous ajouterez const)

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

Utilisez Firebase Robo Test pour la finition

Après la conversion, même si vous pensez avoir écrit le code de test correctement, il peut y avoir des bogues qui dépassent vos attentes. Vous pouvez éviter cela en demandant à un tiers ou à Robo de le tester. Il existe plus de types tels que Nullable / NonNull / Platform, et d'autres états tels que lateinit avant l'initialisation. Nous vous recommandons d'utiliser le test Firebase Robo pour éviter les «erreurs involontaires».

スクリーンショット 2019-05-13 22.50.47.png ↑ Erreur d'exécution trouvée dans mon Robo Test. Une erreur qui a accédé à lateinit avant l'initialisation.

Impressions de 100% Kotlin

Kotlin lui-même est rafraîchissant, mais des erreurs ont tendance à se produire lors du pontage de Kotlin ⇔ Java. C'est une route assez épineuse, il est donc préférable d'en faire un code Java sûr à l'avance. Une fois converti, vous pouvez utiliser des fonctions utiles telles que Coroutine et des fonctions d'extension pour changer votre vie.

Recommended Posts

Résumé des bons points et des précautions lors de la conversion de l'application Java Android vers Kotlin
Résumé des points qui m'inquiétaient lors de la migration de Java vers Kotlin
[Java Silver] Résumé des points liés aux expressions lambda
J'ai essayé de résumer les bases de kotlin et java
[Android] Convertir le code Java Android en Kotlin
[Java] Copie superficielle et copie complète lors de la conversion d'un tableau en liste
[Attention !!] Précautions lors de la conversion de la devise Rails et de l'affichage des fichiers en haml
[Android] Convertissez Map en JSON à l'aide de GSON avec Kotlin et Java
[Java Silver] Résumé des points de modification d'accès
[java] Résumé de la gestion des caractères
Convertir toutes les applications Android (Java) en Kotlin
Résumé des moyens lorsque vous souhaitez communiquer avec HTTP sur Android
[Java] Conseils et problèmes d'erreur lors de la conversion du double en grand décimal
[Java] [Maven3] Résumé de l'utilisation de Maven3
Précautions lors de la migration de VB6.0 vers JAVA
Résumé de Java Math.random et import (calendrier)
De Java à C et de C à Java dans Android Studio
Points sur lesquels je suis tombé lors de la création d'une application Android [Mis à jour de temps en temps]
Résumé en essayant d'utiliser Solr en Java et en obtenant une erreur (Solr 6.x)
Fonctions Kotlin et lambdas à envoyer aux développeurs Java
[java] Résumé de la gestion des chaînes de caractères
Points à prendre en compte lors de l'écriture de Java
Instruction de commutation Java et pause, Kotlin lorsque l'expression ...
[Java] Résumé personnel des classes et méthodes (basique)
[Java] Résumé de la façon d'omettre les expressions lambda
Résumé de la mousse lors de la mise à jour de JMockit 1.4 vers 1.30
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
Précautions lors de la conversion de décimal en binaire
Causes techniques et contre-mesures pour les points accro aux applications Android et Kotlin (3. Traitement lié aux images Android)
L'installation de Java n'est pas facile! Résumé des précautions pour finir parfaitement en une seule fois
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
[Java] Types de commentaires et comment les rédiger
Résumé du comportement de ToString avec les annotations Java et Groovy
Veuillez noter la division (division) de java kotlin Int et Int
La comparaison d'énumération est ==, et equals est bonne [Java]
Langage Java du point de vue de Kotlin et C #
Résumé des connaissances requises pour réussir Java SE8 Silver
Résumé de l'API de communication Java (1) Comment utiliser Socket
Je veux faire des transitions d'écran avec kotlin et java!
Résumé de l'API de communication Java (3) Comment utiliser SocketChannel
Résumé de l'API de communication Java (2) Comment utiliser HttpUrlConnection
Résumé de la mise en œuvre des arguments par défaut en Java
[Java] [Kotlin] Appeler valueOf et les valeurs de Enum de manière générique
[Java] Éléments à prendre en compte lors de la sortie de FizzBuzz
Causes techniques et contre-mesures pour les points accro aux applications Android et Kotlin (1. Traitement de la transition d'écran Android (fragment))
Résumé des points que les programmeurs Java trouvent glissants lorsqu'ils lisent la source Kotlin pour la première fois
Développement d'applications Android (compatibles Java et Kotlin) Comment implémentez-vous cela? ~ Edition du bouton ~
Développement d'applications Android (compatibles Java et Kotlin) Comment implémentez-vous cela? ~ Edition de texte ~
[Android / Kotlin] Résumé de l'interface utilisateur
Causes techniques et contre-mesures pour les points auxquels j'étais accro avec l'application Android et Kotlin (2. Traitement lié à la fonction caméra d'Android *)
Résumé du support Java 2018
Méthode de paramétrage pour lier Java d'Eclipse et Github / septembre 2017
Java qui ignore les données d'Android vers le ROS de Jetson Nano
[Java] Précautions lors de la conversion de paramètres d'argument de longueur variable dans un tableau
Générer et exécuter le fichier Jar du fichier Java appartenant au package
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
Reportez-vous à C ++ dans le module Android Studio (Java / kotlin)
Commande pour vérifier le nombre et l'état des threads Java
Je veux faire une liste avec kotlin et java!