Constantes en Kotlin : arrêtez de deviner, commencez à les utiliser correctement
\n\nSi vous écrivez en Kotlin depuis au moins une semaine, vous avez sûrement déjà été confronté à la question : "Comment déclarer correctement une constante ?" À première vue, tout semble simple — il y a val, const val, companion object. Mais le diable, comme toujours, se cache dans les détails. Et cette question sur Stack Overflow a accumulé des milliers de vues pour une bonne raison.
Penchons-nous une fois pour toutes sur les différentes façons de créer des constantes en Kotlin, quand utiliser laquelle, et pourquoi val n'est pas toujours une constante. C'est parti !
1. val vs const val : quel est le piège ?
\n\nLa question la plus fréquente des débutants : "J'ai écrit val — c'est une constante, non ?" Réponse : oui et non.
val est une référence immuable (lecture seule). Mais la valeur est calculée à l'exécution. Ce n'est donc pas une constante de compilation.
// Ceci n'est PAS une constante de compilation\nval currentTime = System.currentTimeMillis()\n\nconst val est une vraie constante, qui est intégrée dans le code lors de la compilation (comme static final en Java).
// Et voici une constante\nconst val PI = 3.14159\n\nLimitation importante : const val ne peut être utilisé qu'avec des types primitifs et String. Pas d'objets, de listes ou de classes personnalisées.
💡 Règle d'or : Si la valeur est connue à la compilation — utilisez const val. Si elle est calculée à l'exécution — utilisez val.
2. Où déclarer les constantes ? Top 3 des méthodes
\n\nMéthode 1 : Constantes top-level (recommandée)
\n\nLa méthode la plus simple et la plus propre — déclarer une constante au niveau supérieur du fichier. Pas de classes, pas d'objets — juste un fichier avec des constantes.
\n\n// Constants.kt\nconst val BASE_URL = "https://api.example.com"\nconst val TIMEOUT_SECONDS = 30\nconst val APP_NAME = "MyKotlinApp"\n\nPourquoi est-ce génial ?
\n- \n
- Code minimal \n
- Accessible de partout sans préfixes \n
- Le compilateur intègre les valeurs \n
- Facile à refactoriser \n
Méthode 2 : companion object à l'intérieur d'une classe
\n\nApproche classique de Java qui a été reprise dans Kotlin. Utilisez-la lorsque les constantes sont logiquement liées à une classe.
\n\nclass NetworkClient {\n companion object {\n const val DEFAULT_PORT = 8080\n const val PROTOCOL = "https"\n }\n}\n\n// Utilisation\nval port = NetworkClient.DEFAULT_PORT\n\nInconvénient : bruit syntaxique. Avantage : les constantes sont liées au contexte.
\n\nMéthode 3 : object (singleton) pour des groupes de constantes
\n\nLorsqu'il y a beaucoup de constantes et qu'elles doivent être regroupées par sens.
\n\nobject AppConstants {\n const val MAX_LOGIN_ATTEMPTS = 5\n const val SESSION_DURATION = 3600L\n const val DATE_FORMAT = "yyyy-MM-dd"\n\n object Urls {\n const val LOGIN = "/auth/login"\n const val LOGOUT = "/auth/logout"\n }\n}\n\n// Utilisation\nAppConstants.Urls.LOGIN\n\n3. Constantes dans Android : particularités
\n\nSi vous développez pour Android, il y a quelques nuances supplémentaires.
\n\nConstantes dans companion object et @JvmStatic
\n\nPour qu'une constante d'un companion object devienne une véritable constante statique en Java (par exemple pour les annotations), utilisez @JvmStatic :
class MyFragment : Fragment() {\n companion object {\n @JvmStatic\n const val ARG_ID = "id"\n }\n}\n\nConstantes dans les ressources
\n\nN'oubliez pas la méthode classique d'Android — les ressources. Pour les chaînes, couleurs, dimensions :
\n\n// strings.xml\n<string name="app_name">MyApp</string>\n\n// Dans le code\nval appName = getString(R.string.app_name)\n\nMais ce ne sont pas des constantes de compilation.