Le Quotidien Shaarli

Tous les liens d'un jour sur une page.

01/18/21

Kotlin Multiplatform in Five Minutes or Less: Expect / Actuals Statements
thumbnail

Je découvre le mot-clef expect de Kotlin. Son objectif est de dire que pour une même classe, il va y avoir différentes implémentations en fonction de la plateforme.

Par exemple pour la classe (vide) :

expect class KMPDate(formatString: String) {
    fun asString(): String
}

Nous aurons cette première implémentation pour Android :

actual class KMPDate actual constructor(formatString: String) { // 1
    private val dateFormat = SimpleDateFormat(formatString) // 2
    actual fun asString(): String {
        return dateFormat.format(Date()) // 3
    }
}

et cette seconde pour iOS :

actual class KMPDate actual constructor(formatString: String) { // 1
    private val dateFormatter = NSDateFormatter().apply { // 2
        this.dateFormat = formatString
    }
    actual fun asString(): String {
        return formatter.stringFromDate(NSDate()) // 3 
    }
}

KPMDate n'est pas une interface mais bien une classe concrète avec plusieurs implémentions dites "platform-dependent" dans le même fichier.

Mieux encore, c'est compatible avec GraalVM et Kotlin native pour produire des binaires natifs (AMD64 et ARM64 principalement) compilés et linkés statiquement (+ compilation AOT + tree shaking pour les optims) sans avoir besoin d'une JRE d'installée sur l'environnement cible, donc parfait dans des conteneurs très légers par exemple :D