Préférer `object` à une `class` avec `companion object`
💡 Sujet
En venant de Java, on a tendance à vouloir reproduire le comportement des méthodes static (ou du pattern Singleton) en utilisant une class contenant un companion object.
Cependant, Kotlin possède le mot-clé object qui est dédié à la création de Singletons et est beaucoup plus idiomatique pour les classes utilitaires ou les constantes.
🚫 Mauvaise pratique : Le style "Java-like"
Créer une classe standard juste pour y loger un companion object est verbeux et inutilement complexe si la classe n'a pas vocation à être instanciée.
// ❌ Trop verbeux pour un simple utilitaire
class DateUtils {
companion object {
fun format(date: Date): String {
// ...
return "..."
}
}
}
// Utilisation
DateUtils.format(myDate)En réalité, cela crée une classe DateUtils inutile + une instance de l'objet compagnon.
✅ Bonne pratique : Utiliser object
Le mot-clé object définit une déclaration de classe et en crée une instance unique (Singleton) thread-safe et lazy (créée à la première utilisation).
// ✅ Concis et idiomatique
object DateUtils {
fun format(date: Date): String {
// ...
return "..."
}
}
// Utilisation identique
DateUtils.format(myDate)C'est exactement ce qu'il faut utiliser pour :
- Les classes utilitaires (Helpers).
- Les regroupements de constantes.
- Les implémentations de Singletons.
🧩 Résumé
- 🚫 Eviter
class+companion objectsi vous ne comptez jamais instancier la classe. - ✅ Utiliser
object: c'est la façon native de faire un Singleton en Kotlin. - 💡 Le code est plus léger, plus clair et gère l'instanciation unique automatiquement.