Introduction : Pourquoi data class ne veut-elle pas être vide ?
\n\nAvez-vous déjà essayé de créer une data class en Kotlin pour Android et découvert avec surprise que le compilateur refuse d'accepter un constructeur vide ? Si oui, vous n'êtes pas seul. Cette question a recueilli des milliers de vues sur Stack Overflow, ce qui signifie que des centaines de développeurs (des débutants aux expérimentés) sont tombés dans le même piège.
Pourquoi cela se produit-il ? En fait, une data class en Kotlin n'est pas simplement une classe pour stocker des données. Elle génère automatiquement les fonctions equals(), hashCode(), toString(), copy() et componentN(). Et pour toute cette magie, elle a besoin d'un constructeur primaire avec au moins un paramètre. Sans cela, impossible.
Dans cet article, nous allons analyser le top 5 des erreurs commises par les développeurs lorsqu'ils tentent de créer un constructeur vide pour une data class en Kotlin Android, et montrer comment les éviter. C'est parti !
Erreur n°1 : Déclaration directe d'un constructeur vide
\n\nL'erreur la plus courante est d'essayer d'écrire quelque chose comme :
\n\n// ❌ Pas possible !\ndata class User {\n constructor() : this() // Erreur de compilation\n}\n\n\nKotlin exige strictement que le constructeur primaire soit déclaré dans l'en-tête de la classe. Si vous essayez de créer un constructeur secondaire sans paramètres qui s'appelle lui-même, vous obtiendrez une récursion infinie et une erreur de compilation.
\n\nSolution : Valeurs par défaut
\n\nLa méthode la plus simple et élégante consiste à définir des valeurs par défaut pour tous les paramètres du constructeur primaire :
\n\n// ✅ Correct : valeurs par défaut\ndata class User(\n val name: String = "",\n val age: Int = 0,\n val email: String = ""\n)\n\n// Maintenant, on peut créer un objet sans arguments\nval emptyUser = User()\nprintln(emptyUser) // User(name=, age=0, email=)\n\n\nCette approche fonctionne « prête à l'emploi » et ne nécessite aucun plugin ou annotation supplémentaire. Vous obtenez un constructeur vide complet, et tous les champs sont initialisés avec des valeurs par défaut.
\n\nErreur n°2 : Ignorer les exigences des bibliothèques (Room, Retrofit, Gson)
\n\nDe nombreuses bibliothèques Android nécessitent un constructeur vide pour créer des objets par réflexion. L'exemple classique est Room :
\n\n// ❌ Room générera une erreur\n@Entity\ndata class User(\n @PrimaryKey val id: Int,\n val name: String,\n val age: Int\n)\n\n\nEn essayant d'utiliser une telle data class avec Room, vous obtiendrez une exception : Cannot instantiate User using no-arg constructor. Des problèmes similaires surviennent avec Gson et Retrofit lors de la désérialisation JSON.
Solution : Valeurs par défaut + types nullable
\n\nPour Room, il suffit d'ajouter des valeurs par défaut :
\n\n// ✅ Room est content\n@Entity\ndata class User(\n @PrimaryKey val id: Int = 0,\n val name: String = "",\n val age: Int = 0\n)\n\n\nPour Gson et Retrofit, il est souvent plus simple d'utiliser des types nullable :
\n\n// ✅ Pour fonctionner avec JSON\ndata class ApiResponse(\n val status: String? = null,\n val data: List<Item>? = null\n)\n\n\nMais attention : les types nullable peuvent entraîner des NPE si vous oubliez de vérifier la valeur. Utilisez-les en connaissance de cause.
\n\nErreur n°3 : Plugin Kotlin No-Arg oublié
\n\nParfois, les valeurs par défaut ne conviennent pas. Par exemple, si vous utilisez Jackson pour la sérialisation et que vous avez besoin de types spécifiques sans nullable. Dans ce cas, le plugin kotlin-noarg vient à la rescousse.
De nombreux développeurs pensent à tort qu'il suffit d'ajouter une dépendance dans build.gradle. Mais sans configuration correcte, le plugin ne fonctionnera pas.
Solution : Configuration correcte de No-Arg
\n\nAjoutez le plugin dans build.gradle.kt