[Kotlin] Die auf Java basierende Mapping-Bibliothek funktioniert grundsätzlich nicht mit Kotlin.

Ich sehe oft Geschichten wie "ModelMapper", dass "Mapping-Bibliotheken, die Reflektion für" Java "verwenden, nicht für die" Datenklasse "von" Kotlin "funktionieren. Warum ist das so und um damit umzugehen? Schreiben Sie, welche Mittel Sie haben.

TL;DR

Ergänzung

In diesem Artikel verwenden wir den Begriff Mapping-Bibliothek, um Folgendes zu bedeuten:

Auch das Kartenziel auf "Kotlin" spielt keine Rolle, ob es sich um "Klasse" oder "Datenklasse" handelt. Da es sich jedoch häufig um "Datenklasse" handelt, wird in diesem Artikel "Datenklasse" angenommen. Behandeln wie.

Text

Versuchen Sie zu dekompilieren

Um zu bestätigen, dass "Datenklasse keinen argumentlosen Konstruktor hat", dekompilieren Sie die folgende Klasse mit der Funktion "Idee".

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

Das Ergebnis ist wie folgt. Sie können sehen, dass es keine Definition eines Konstruktors ohne Argumente gibt.

Dekompilierungsergebnis (* Teile, die nicht mit dem Inhalt des Artikels zusammenhängen, wurden weggelassen)



/*Abkürzung*/

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;
   }

   /*Abkürzung*/

Bewegen Sie sich auch mit Gewalt

Wie bisher erläutert, funktioniert die reflexionsbasierte Mapping-Bibliothek für "Java" nicht für die "Datenklasse" von "Kotlin". Es gibt jedoch mehrere Möglichkeiten, dies zu erzwingen.

Verwenden Sie das No-Arg-Compiler-Plugin

Die Kotlin-Formel bietet ein Plug-In, das einen argumentlosen Konstruktor hinzufügt, der nur zur Laufzeit aufgerufen werden kann. Auf diese Weise wird die Nullsicherheit verletzt, aber die traditionelle Bibliothek scheint zu funktionieren.

Schreiben Sie einen Konstruktor ohne Argumente auf Kotlin

Wenn Sie die zugeordnete Klasse so schreiben, dass sie wie "POJO" von "Java" funktioniert, funktioniert die herkömmliche Bibliothek. Durch Trennen der Schnittstelle, die nach außen zeigt, und der Implementierung der Klasse, in der die tatsächlichen Daten gespeichert sind, kann eine Situation realisiert werden, die "von außen wie eine normale" Datenklasse "aussieht".

Wenn Sie die vollständige Kotlin-Konvertierung aufgeben möchten, können Sie sie mit POJO implementieren und dem Getter eine Anmerkung hinzufügen, die Nullability darstellt.

Über die Bibliothek, die Kotlin entspricht

Schließlich werde ich, soweit ich weiß, über die Mapping-Bibliothek "Object to Object" schreiben, die "Kotlin" unterstützt.

KMapper Dies ist eine auf Funktionsaufrufen basierende Mapping-Bibliothek, die vom Autor basierend auf der Reflexion von "Kotlin" erstellt wurde. Zusätzlich zu "Objekt" können Sie "Karte" usw. als Argument verwenden oder eine Zuordnung aus mehreren Argumenten durchführen.

Mach dein eigenes

Funktionsaufrufe durch Reflektion von "Kotlin" können relativ einfach implementiert werden, so dass ich der Meinung bin, dass es einfach ist, schnell eigene zu erstellen, wenn Sie keine Funktionalität benötigen.

MapStruct Obwohl es sich zum Zeitpunkt des Schreibens in der Beta-Phase befindet, scheint "MapStruct" das Mapping zu unterstützen, indem der Konstruktor von "1.4" aufgerufen wird.

Als Ergänzung werde ich die Details weglassen, aber ich denke, dass es einfach ist, "Kotlin" zu unterstützen, selbst wenn es für "Java" ist, wenn es sich um eine Bibliothek handelt, die auf "Annotation-Processor" basiert.

Jackson Da "Jackson" Kotlin-Unterstützung hat, kann das Mapping durch das Verfahren "einmal in JSON konvertieren -> deserialisieren" erreicht werden. Es hat viele Funktionen und kann für verschiedene Quellen verwendet werden, solange es serialisiert werden kann. Daher kann es überraschend gut sein, "Jackson" mit Ausnahme der Ausführungsgeschwindigkeit zu verwenden.

Recommended Posts

[Kotlin] Die auf Java basierende Mapping-Bibliothek funktioniert grundsätzlich nicht mit Kotlin.
Die Korrespondenz, wenn eine Java-Anwendung mit launch4j in exe erstellt wurde, funktioniert unter Windows, in dem openJDK installiert ist, nicht
Der Java Integer-Vergleich (==) funktioniert nicht richtig
Funktioniert die Escape-Sequenz (\) nicht? (für Mac)
Erkennt die Bibliothek bei der Implementierung von jcaptcha nicht
Was tun, wenn die Annotation JSON Hint nicht mit Lombok und JSONIC funktioniert?
Verwenden Sie die schnelle Mapping-Bibliothek MapStruct mit Lombok und Java 11
Hinweis: Memory Analyzer funktioniert unter Mac OS nicht
Ein Memo beim Abrufen der eingehenden Nummer mit Broadcast Receiver unter Android 9/10 funktioniert nicht