0Pricing
Kotlin Academy · Leçon

Limitations

Ce que les classes de valeurs ne peuvent pas faire

Limitations est une leçon Kotlin Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Kotlin Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Kotlin Academy comprend 4 leçons au total.

Connaître les limites

Les classes de valeur sont puissantes, mais présentent des contraintes. Comprendre leurs limites vous aide à choisir le bon outil et à éviter les surprises.

Exactement une propriété

Une classe de valeur enveloppe une valeur unique. Pour regrouper plusieurs champs, vous avez besoin d'une classe ordinaire ou d'une data class.

// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed

data class Range(val lo: Int, val hi: Int)

fun main() {
    println(Range(1, 10))
}

Aucun état d'initialisation au-delà de la valeur

Les classes de valeur ne peuvent pas avoir de champs de stockage autres que l'unique propriété du constructeur. Un état var supplémentaire avec un champ de stockage n'est pas autorisé.

@JvmInline
value class Counter(val value: Int) {
    // val cached: Int = value * 2  // not allowed: extra backing field
    val doubled: Int get() = value * 2  // computed is fine
}

fun main() {
    println(Counter(3).doubled)
}

Aucun héritage

Les classes de valeur sont implicitement final. Elles ne peuvent pas étendre d'autres classes et ne peuvent pas être étendues. Elles peuvent uniquement implémenter des interfaces.

interface Named { val label: String }

@JvmInline
value class Tag(val text: String) : Named {
    override val label: String get() = text
}

fun main() {
    println(Tag("urgent").label)
}

Le coût de l'encapsulation en objet réapparaît

La promesse d'un surcoût nul disparaît lorsque la valeur est utilisée comme type nullable, générique ou d'interface. Le compilateur l'encapsule alors dans un véritable objet.

@JvmInline
value class Id(val raw: Int)

fun main() {
    val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
    println(list.map { it.raw })
}

Aucune identité

Les classes de valeur n'ont pas d'identité référentielle stable. L'égalité de référence avec === n'a aucun sens, et elles ne peuvent pas être utilisées là où l'identité d'un objet est importante, par exemple comme verrou de synchronisation.

@JvmInline
value class Code(val value: Int)

fun main() {
    val a = Code(5)
    val b = Code(5)
    println(a == b)   // structural equality works
}

Ni initialisation différée ni délégation

Vous ne pouvez pas appliquer lateinit à la valeur sous-jacente, et les classes de valeur ne prennent pas en charge la délégation de propriété sur leur champ unique. La valeur doit être définie dans le constructeur.

@JvmInline
value class Slug(val value: String)

fun main() {
    val s = Slug("hello-world") // must be provided up front
    println(s.value)
}

Encodage des noms sur la JVM

Sur la JVM, les fonctions qui acceptent des paramètres de classe de valeur reçoivent des noms encodés dans le code binaire afin d'éviter les collisions. Cela complique l'interopérabilité avec Java ; les appelants Java peuvent ne pas les voir correctement.

@JvmInline
value class Hz(val value: Int)

fun tune(freq: Hz) = freq.value

fun main() {
    println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}

Pas pour les enveloppes à plusieurs champs

Si vous vous surprenez à vouloir deux propriétés, une classe de valeur n'est pas le bon outil. Utilisez plutôt une data class, en acceptant l'allocation en échange d'une structure plus riche.

data class Coordinate(val lat: Double, val lng: Double)

fun main() {
    println(Coordinate(41.0, 29.0))
}

Résumé des limites

Les classes de valeur ne peuvent pas :

  • Contenir plus d'une propriété
  • Avoir des champs de stockage supplémentaires ou lateinit
  • Hériter de classes ou être étendues par des classes
  • Fournir une identité référentielle
  • Éviter toujours l'encapsulation en objet

Choisir judicieusement

Utilisez une classe de valeur pour une valeur unique, validée et sûre du point de vue des types. Utilisez une classe de données pour regrouper des données. Utilisez un alias de type pour améliorer uniquement la lisibilité, sans apporter de sécurité. Chacune a son utilité.

Vérification rapide

Vérifiez votre compréhension des limites des classes de valeur.

Récapitulatif

Vous avez appris les limites des classes de valeur :

  • Une seule propriété, sans champ de stockage supplémentaire
  • Aucun héritage ni aucune identité
  • L'encapsulation en objet réapparaît lors d'une utilisation nullable, générique ou comme interface
  • L'encodage des noms sur la JVM complique l'interopérabilité avec Java

Adaptez l'outil au besoin.

Questions Fréquemment Posées

La leçon « Limitations » est-elle gratuite ?

Oui — le texte complet de « Limitations » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Kotlin Academy, passe à CoddyKit PRO. Le cours Kotlin Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Limitations » ?

Ce que les classes de valeurs ne peuvent pas faire Tu pratiques Kotlin Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Kotlin Academy ?

Aucune expérience préalable n'est requise. Kotlin Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Limitations » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Kotlin Academy ?

Oui. Chaque leçon Kotlin Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Alias de types
  2. Classes de valeurs inline
  3. Cas d’utilisation
  4. Limitations
← Retour à Kotlin Academy