Migrer de Java vers Kotlin côté serveur + Spring-boot

Avec l'adoption de Google comme langue officielle d'Android, la commune de Kotlin se développe. Pendant ce temps, nous sommes passés de Java, qui est utilisé comme langage côté serveur, à Kotlin côté serveur.

Avantages et inconvénients de l'adoption de Kotlin: baby_chick:

Voici quelques-uns des avantages de la migration vers Kotlin. C'est une introduction légère car il s'agit d'une spécification linguistique de la partie dont on parle souvent.

mérite

Démérite

Kotlin ne vous permet pas d'attribuer null à une variable de type qui n'est pas facultative. C'est très sûr car le compilateur garantit qu'il n'est pas nul. De plus, s'il est facultatif, une vérification est requise lors de la récupération de la valeur.

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 a une expression when similaire à la correspondance de Scala. Il correspond à un commutateur en Java, mais la différence est qu'il renvoie une valeur et garantit l'exhaustivité de l'énumération.

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 { ... }

Cette (Licence) est transmise dans l'expression when. Nous savons que la licence est GRATUITE ou ENTREPRISE, nous n'avons donc pas à écrire le processus par défaut (ou bien dans kotlin) dans l'expression when. En outre, ** S'il y a une omission dans le modèle d'énumération, une erreur de compilation se produira, donc l'exhaustivité peut être garantie *. ( Il y a quelques restrictions)

・ ・ ・

Le système prend beaucoup de temps pour évoluer et prendre le relais. Kotlin est livré avec des spécifications linguistiques valides pour les exécuter en toute sécurité. Je pense que les fonctionnalités mentionnées dans le mérite sont des fonctionnalités notables qui adoptent Kotlin car elles ont un support plus fort que Java.

En passant, puisque le système existant a été construit avec Spring-boot + Mavan, pouvoir l'utiliser tel quel a également été un facteur majeur de la transition car le coût d'apprentissage a été considérablement réduit.

Problèmes lors de l'adoption de Kotlin côté serveur + Spring-boot: pieds:

Même avec les avantages, il y avait des obstacles au développement réel. Je voudrais en présenter quelques-uns.

Impossible de trouver la méthode d'exécution statique pour SpringApplication

En Java, SpringApplication est décrit comme suit, mais il ne fonctionnait pas lorsqu'il était utilisé tel qu'il a été généré par Spring Initializr.

@EnableAutoConfiguration
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

La statique de Kotlin est implémentée via Companion (ainsi que Scala), alors écrivez: Ajoutez également l'annotation JvmStatic afin qu'elle puisse être appelée depuis Java.

@SpringBootApplication
@EnableAutoConfiguration
class MyApplication {
    companion object {
        @JvmStatic fun main(vararg args: String) {
            SpringApplication.run(MyApplication::class.java, *args)
        }
    }
}

Mockito's any ou anyObject lève une exception

Any / anyObject de Mockito est implémenté en interne pour retourner null. Quand j'essaye d'utiliser ceci dans Kotlin, j'obtiens une exception IllegalStateException ** lorsqu'elle est passée à un argument non nul **.

En guise de solution, il semble possible de passer la vérification nulle en utilisant les génériques de Kotlin. Vous pouvez utiliser la classe Helper suivante.

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

J'ai fait référence à l'article ici. Merci: arc: *** Veuillez noter que cette solution peut ne plus être disponible **.

Impossible de trouver le constructeur principal pour la classe de données avec l'annotation RequestBody

Json n'a pas pu mapper à DataClassResource et a lancé une exception lorsque je viens de déposer le code Java habituel dans Kotlin.

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

J'appelle le constructeur d'une classe avec l'annotation RequestBody pour l'initialiser, mais je n'arrive pas à trouver le constructeur principal de Kotlin.

Ce problème peut être résolu en ajoutant une version compatible Kotlin du module Jackson en tant que dépendance. Ajoutons le package suivant en tant que dépendance.

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-kotlin</artifactId>
    <version>2.8.0</version>
</dependency>

Tips :cookie:

Les classes Java ne peuvent pas être étendues car la méthode statique Extension ne peut être qu'une classe avec un objet compagnon

Lorsque vous étendez des méthodes statiques dans Kotlin, implémentez-les via Companion. Cependant, les classes Java n'ont pas d'objets compagnons, elles ne peuvent donc pas implémenter des fonctions d'extension ou des propriétés telles que:

fun JavaClass.Companion.extensionMethod() {
    ...
}

Il existe également un problème sur YouTrack. Je veux que vous le mettiez en œuvre. https://youtrack.jetbrains.com/issue/KT-11968

Prise en charge des méthodes Java qui peuvent être nulles avec facultatif

Les méthodes Java peuvent être nulles même si elles ne sont pas facultatives. Si vous souhaitez assurer la sécurité dans la zone de Kotlin, il semble préférable de recevoir le résultat de la méthode Java en option.

val maybe: String? = javaClass.method()

Injection de haricots définie comme val

Lors de la définition de la propriété à injecter avec l'annotation Autowired, si vous la définissez normalement, cela provoquera une erreur de compilation due à la désinitialisation, définissez-la donc avec lateinit pour une initialisation retardée.

@Component("sample")
class Sample {
    @Autowired
    private lateinit var dependency: Dependency
}

Cependant, «lateinit» ne peut être défini qu'avec «var». Si vous voulez définir avec val, utilisez le constructeur principal.

@Component("sample")
class Sample @Autowired constructor(private val dependency: Dependency) {
}

Je veux définir des propriétés qui ne changent pas autant que possible avec Immutable.

À la fin

Nous avons pu procéder au développement avec une vitesse stable, malgré quelques obstacles. Il est plus sécurisé au niveau du compilateur et offre une meilleure visibilité du code. Je pense que la puissance de ce soutien sera démontrée lors de la mise à l'échelle à l'avenir. Il y a aussi une description propre à Kotlin, il serait donc bon de continuer tout en explorant la politique dans la revue! Cependant, j'ai senti que le seuil de migration de Java vers Kotlin et le coût de l'apprentissage étaient à nouveau bas. Je veux que Kotlin côté serveur soit de plus en plus excitant: tada:

Recommended Posts

Migrer de Java vers Kotlin côté serveur + Spring-boot
Mémo pour la migration de Java vers Kotlin
Changements de Java 8 à Java 11
Somme de Java_1 à 100
Migrer de JUnit 4 vers JUnit 5
[Java] Comment récupérer les paramètres passés du html côté serveur
Vérifiez le jeton d'ID obtenu de Firebase côté serveur (Java + SpringBoot)
De Java à Ruby !!
Développement de serveur Minecraft BE de PHP à Java
Migration de Cobol vers JAVA
Nouvelles fonctionnalités de Java7 à Java8
Connectez-vous de Java à PostgreSQL
De Java inefficace à Java efficace
Que ce soit pour faire du côté serveur au moment de la reconstruction du système avec Kotlin ou Java
Arrêter de renvoyer du client au serveur
Classe Kotlin à envoyer aux développeurs Java
Migrer l'image Docker vers un autre serveur
Migrer de on-prepukiwiki vers esa.io \ (⁰⊖⁰) /
Java sera impliqué dès aujourd'hui
De Java à VB.NET - Écriture de notes de contraste
Java, interface pour partir du débutant
La route de JavaScript à Java
[Android] Convertir le code Java Android en Kotlin
[Java] Conversion d'un tableau à une liste
Remarques sur la création de l'environnement de développement de Kotlin et la migration de Java vers Kotlin
Ce à quoi j'ai pensé lorsque j'ai commencé à migrer de Java vers Kotlin
Kotlin's Class part.2 à envoyer aux développeurs Java
[Kotlin] Trois façons d'obtenir un cours depuis KClass
Convertir toutes les applications Android (Java) en Kotlin
Kick ShellScript sur le serveur depuis Java
Convertir l'heure UTC Java en heure JST
Connectez-vous de Java à MySQL à l'aide d'Eclipse
De l'installation d'Eclipse à l'exécution de Java (PHP)
Fonctions de portée Kotlin à envoyer aux développeurs Java
Publier sur Slack à partir de Play Framework 2.8 (Java)
Java: Comment envoyer des valeurs du servlet au servlet
[Java] Flux du code source à l'exécution
Obtenir l'historique du serveur Zabbix en Java
Introduction à la surveillance à partir de Java Touching Prometheus
Précautions lors de la migration de VB6.0 vers JAVA
Migrons pour rendre Java plus confortable
Conversion de type du type java Big Decimal au type String
Résumé des points qui m'inquiétaient lors de la migration de Java vers Kotlin
[Java] De deux listes à une liste de tableaux
Fonctions Kotlin et lambdas à envoyer aux développeurs Java
Migrer Ubuntu 18.04 LTS du disque dur vers un SSD plus petit
Exécuter R à partir de Java Je veux exécuter rJava
Présentation de Kotlin à un projet Java Maven existant
Connectez-vous à Aurora (MySQL) depuis une application Java
Pour devenir programmeur VB.net depuis une boutique Java
Comment obtenir une classe depuis Element en Java
Paramètres initiaux pour la réécriture de projets Java sur Kotlin
Migration de la fonction serveur Eclipse (Tomcat) vers Embed Tomcat
Premiers pas avec Kotlin à envoyer aux développeurs Java
[Java] Comment passer de jdk ouvert à jdk oracle
Migrer du client de transport vers le client de niveau supérieur Rest
Ce que j'ai fait lorsque j'ai converti Java en Kotlin
Pour les ingénieurs Java qui démarrent Kotlin à partir de maintenant
Je veux écrire rapidement de java vers sqlite
Où les programmeurs Java ont tendance à trébucher sur Kotlin