Mit der Einführung von Google als offizielle Sprache für Android wächst die Kotlin-Gemeinde. In der Zwischenzeit sind wir von Java, das als serverseitige Sprache verwendet wird, zu serverseitigem Kotlin gewechselt.
Hier sind einige der Vorteile einer Migration nach Kotlin. Es ist eine leichte Einführung, da es sich um eine Sprachspezifikation des Teils handelt, über den oft gesprochen wird.
In Kotlin können Sie einer Variablen des Typs, der nicht optional ist, keine Null zuweisen. Es ist sehr sicher, da der Compiler garantiert, dass es nicht null ist. Wenn dies optional ist, ist beim Abrufen des Werts eine Überprüfung erforderlich.
fun main(vararg args: String) {
val user: User? = null
println(user?.fullName ?: "unknown")
}
data class User(val familyName: String, val firstName: String) {
val fullName: String
get() = "${this.familyName} ${this.firstName}"
}
Kotlin hat einen ähnlichen When-Ausdruck wie Scalas Match. Es entspricht einem Schalter in Java, gibt jedoch einen Wert zurück und garantiert die Vollständigkeit der Aufzählung.
fun method(license: License) {
val service = license.createService()
}
enum class License {
FREE,
ENETERPRISE;
fun createService(): Service {
return when (this) {
FREE -> FreeService()
ENETERPRISE -> EnterpriseService()
}
}
}
interface Service { ... }
class FreeService: Service { ... }
class EnterpriseService: Service { ... }
Diese (Lizenz) wird im when-Ausdruck übergeben. Wir wissen, dass die Lizenz KOSTENLOS oder UNTERNEHMEN ist, daher müssen wir den Standardprozess (oder sonst in Kotlin) nicht in den when-Ausdruck schreiben. Außerdem: ** Wenn das Aufzählungsmuster nicht angegeben ist, tritt ein Kompilierungsfehler auf, sodass die Vollständigkeit garantiert werden kann *. ( Es gibt einige Einschränkungen)
・ ・ ・
Die Skalierung und Übernahme des Systems dauert lange. Kotlin wird mit gültigen Sprachspezifikationen geliefert, um diese sicher auszuführen. Ich denke, dass die im Verdienst erwähnten Funktionen bemerkenswerte Funktionen sind, die Kotlin übernehmen, weil sie eine stärkere Unterstützung als Java haben.
Abgesehen davon war, da das vorhandene System mit Spring-boot + Mavan gebaut wurde, die Möglichkeit, es so zu verwenden, wie es ist, auch ein wichtiger Faktor für den Übergang, da die Lernkosten erheblich reduziert wurden.
Trotz der Vorteile gab es einige Stolpersteine in der tatsächlichen Entwicklung. Ich möchte einige davon vorstellen.
In Java wird SpringApplication wie folgt beschrieben, funktionierte jedoch nicht, wenn es von Spring Initializr generiert wurde.
@EnableAutoConfiguration
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Kotlins Statik wird über Companion (sowie Scala) implementiert. Schreiben Sie also: Fügen Sie außerdem die Annotation JvmStatic hinzu, damit sie von Java aus aufgerufen werden kann.
@SpringBootApplication
@EnableAutoConfiguration
class MyApplication {
companion object {
@JvmStatic fun main(vararg args: String) {
SpringApplication.run(MyApplication::class.java, *args)
}
}
}
Mockitos any / anyObject wird intern implementiert, um null zurückzugeben. Wenn ich versuche, dies in Kotlin zu verwenden, erhalte ich eine IllegalStateException-Ausnahme **, wenn sie an ein Nicht-Null-Argument ** übergeben wird.
Als Lösung scheint es möglich zu sein, die Nullprüfung mit Kotlins Generika zu überwinden. Sie können die folgende Helper-Klasse verwenden.
class MockitoHelper {
companion object {
fun <T> any(): T {
return Mockito.any() ?: null as T
}
}
fun <T> eq(value: T): T {
return if (value != null) Mockito.eq(value)
else null ?: null as T
}
}
Ich habe auf den Artikel [hier] verwiesen (http://jabnz.blog69.fc2.com/blog-entry-935.html). Danke: Bogen: *** Bitte beachten Sie, dass diese Lösung möglicherweise nicht mehr verfügbar ist **.
Json konnte der DataClassResource nicht zugeordnet werden und löste eine Ausnahme aus, als ich gerade den üblichen Java-Code in Kotlin ablegte.
data class DataClassResource(val key: String, val value: String)
@RestController
@Component
class DataClassController {
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/update", method = arrayOf(PUT), produces = arrayOf(APPLICATION_JSON_VALUE))
fun update(@RequestBody resource: DataClassResource) {
...
}
}
Ich rufe den Konstruktor einer Klasse mit der Annotation RequestBody auf, um sie zu initialisieren, aber ich kann den primären Konstruktor für Kotlin nicht finden.
Dieses Problem kann behoben werden, indem eine Kotlin-fähige Version des Jackson-Moduls als Abhängigkeit hinzugefügt wird. Fügen wir das folgende Paket als Abhängigkeit hinzu.
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>2.8.0</version>
</dependency>
Tips :cookie:
Wenn Sie statische Methoden in Kotlin erweitern, implementieren Sie sie über Companion. Java-Klassen verfügen jedoch nicht über Companion-Objekte, sodass sie keine Erweiterungsfunktionen oder -eigenschaften wie Folgendes implementieren können:
fun JavaClass.Companion.extensionMethod() {
...
}
Es gibt auch ein Problem bei YouTrack. Ich möchte, dass Sie es implementieren. https://youtrack.jetbrains.com/issue/KT-11968
Java-Methoden können null sein, auch wenn sie nicht optional sind. Wenn Sie die Sicherheit im Bereich Kotlin gewährleisten möchten, ist es besser, das Ergebnis der Java-Methode als optional zu erhalten.
val maybe: String? = javaClass.method()
Wenn Sie beim Definieren der Eigenschaft, die mit der Autowired-Annotation eingefügt werden soll, diese normal definieren, wird aufgrund der Nichtinitialisierung ein Kompilierungsfehler verursacht. Definieren Sie sie daher für die verzögerte Initialisierung mit "lateinit".
@Component("sample")
class Sample {
@Autowired
private lateinit var dependency: Dependency
}
Lateinit
kann jedoch nur mit var
definiert werden. Wenn Sie mit val
definieren möchten, verwenden Sie den Primärkonstruktor.
@Component("sample")
class Sample @Autowired constructor(private val dependency: Dependency) {
}
Ich möchte Eigenschaften definieren, die sich mit Immutable nicht so weit wie möglich ändern.
Trotz einiger Stolpersteine konnten wir die Entwicklung mit stabiler Geschwindigkeit fortsetzen. Es ist auf Compilerebene sicherer und hat eine bessere Code-Sichtbarkeit. Ich denke, dass die Leistungsfähigkeit dieser Unterstützung in Zukunft bei der Skalierung demonstriert wird. Es gibt auch eine Beschreibung, die Kotlin eigen ist. Es wäre also gut, fortzufahren, während Sie die Richtlinien in der Überprüfung untersuchen! Ich hatte jedoch das Gefühl, dass die Schwelle für die Migration von Java nach Kotlin und die Lernkosten wieder niedrig waren. Ich möchte, dass Server Side Kotlin immer aufregender wird: tada:
Recommended Posts