[Kotlin] La bibliothèque de mappage basée sur la réflexion basée sur Java ne fonctionne fondamentalement pas avec Kotlin.

Je vois souvent des histoires telles que «ModelMapper» que «les bibliothèques de mappage qui utilisent la réflexion pour« Java »ne fonctionnent pas pour la« classe de données »de« Kotlin »», alors pourquoi est-ce le cas et comment gérer cela? Écrivez le genre de moyens dont vous disposez.

TL;DR

Supplément

Dans cet article, nous utilisons le terme bibliothèque de mappage pour signifier:

De plus, la destination de la carte sur Kotlin n'a pas d'importance qu'il s'agisse de classe ou de classe de données, mais comme il s'agira souvent de classe de données, la classe de données est supposée dans cet article. Traiter comme.

Texte

Essayez de décompiler

Pour confirmer que " data class n'a pas de constructeur sans argument ", essayez de décompiler la classe suivante avec la fonction de ʻidea`.

data class Sample(val foo: Int, val bar: Int?)

Le résultat est le suivant. Vous pouvez voir qu'il n'y a pas de définition d'un constructeur sans argument.

Résultat de la décompilation (* Les parties non liées au contenu de l'article ont été omises)



/*Abréviation*/

public final class Sample {
   private final int foo;
   @Nullable
   private final Integer bar;

   public final int getFoo() {
      return this.foo;
   }

   @Nullable
   public final Integer getBar() {
      return this.bar;
   }

   public Sample(int foo, @Nullable Integer bar) {
      this.foo = foo;
      this.bar = bar;
   }

   /*Abréviation*/

Bougez même par la force

Comme expliqué jusqu'ici, la bibliothèque de mappage basée sur la réflexion pour Java ne fonctionne pas pour la classe de données dans Kotlin. Cependant, il existe plusieurs façons de le forcer.

Utiliser le plugin de compilation No-arg

La formule Kotlin fournit un plug-in qui ajoute un constructeur sans argument qui ne peut être appelé qu'au moment de l'exécution. En utilisant ceci, la sécurité «null» est cassée, mais la bibliothèque traditionnelle semble fonctionner.

Ecrire un constructeur sans argument sur Kotlin

Si vous écrivez la classe mappée pour qu'elle fonctionne comme «POJO» de «Java», la bibliothèque classique fonctionnera. De plus, en séparant l'interface qui expose à l'extérieur et l'implémentation de la classe qui stocke les données réelles, une situation qui "ressemble à une" classe de données "normale de l'extérieur" peut être réalisée.

Si vous souhaitez abandonner la conversion complète Kotlin, vous pouvez l'implémenter avec POJO et ajouter une annotation représentant Nullability au getter.

A propos de la bibliothèque correspondant à Kotlin

Enfin, pour autant que je sache, j'écrirai sur la bibliothèque de mappage ʻObject to Object qui prend en charge Kotlin`.

KMapper Il s'agit d'une bibliothèque de mappage basée sur les appels de fonction créée par l'auteur sur la base du reflet de Kotlin. En plus de ʻObject, vous pouvez prendre Map` comme argument ou effectuer un mappage à partir de plusieurs arguments.

Faire votre propre

Les appels de fonction par reflet de Kotlin peuvent être implémentés relativement facilement, donc je pense qu'il est facile de créer les vôtres rapidement si vous n'avez pas besoin de fonctionnalités.

MapStruct Bien qu'il soit en version bêta au moment de l'écriture, MapStruct semble prendre en charge le mappage en appelant le constructeur depuis 1.4.

En complément, je vais omettre les détails, mais je pense que s'il s'agit d'une bibliothèque basée sur ʻannotation-processor, il est facile de supporter Kotlinmême si c'est pourJava`.

Jackson Puisque «Jackson» a le support de «Kotlin», cela permet au mappage d'être réalisé par la procédure de «convertir en« JSON »une fois -> désérialiser». Il a beaucoup de fonctions et peut être utilisé pour diverses sources tant qu'il peut être sérialisé, il peut donc être étonnamment bon d'utiliser Jackson sauf pour la vitesse d'exécution.

Recommended Posts

[Kotlin] La bibliothèque de mappage basée sur la réflexion basée sur Java ne fonctionne fondamentalement pas avec Kotlin.
Correspondance lorsque l'application Java transformée en exe avec launch4j ne fonctionne pas sur les fenêtres où openJDK est installé
La comparaison Java Integer (==) ne fonctionne pas correctement
[Pour les débutants] Lorsque vous voulez dire que l'option JVM (-D) ne fonctionne pas avec la commande java -jar, ou que la bibliothèque est boguée.
La séquence d'échappement (\) ne fonctionne-t-elle pas? (pour Mac)
Ne reconnaît pas la bibliothèque lors de l'implémentation de jcaptcha
Que faire si l'annotation JSON Hint ne fonctionne pas avec Lombok et JSONIC
Utilisez Fast Mapping Livery MapStruct avec Lombok et Java 11
Remarque: l'analyseur de mémoire ne fonctionne pas sous Mac OS
Un mémo lors de l'obtention du numéro entrant à l'aide de Broadcast Receiver sur Android 9/10 ne fonctionne pas