244 votes

Constantes en Kotlin - quelle est la méthode recommandée pour les créer ?

Comment est-il recommandé de créer des constantes en Kotlin ? Et quelle est la convention de dénomination ? Je n'ai pas trouvé cela dans la documentation.

companion object {
    //1
    val MY_CONST = "something"

    //2
    const val MY_CONST = "something"

    //3
    val myConst = "something"
}

Ou ... ?

5 votes

Si vous voulez quelque chose correspondant à un public static final en Java, utilisez const val dans votre objet compagnon. Si vous voulez un private static final et un récupérateur public, utilisez val dans votre objet compagnon.

6 votes

Voici le billet de blog qui explique comment définir des constantes en Kotlin : blog.egorand.me/où-est-ce-que-je-mets-mes-constantes-en-kotlin ?

1 votes

Checkout cet article . Il donne une bonne vue d'ensemble des différentes manières de stocker vos constantes, avec les compromis de performance associés.

198voto

sudesh Points 527

Évitez d'utiliser des objets d'accompagnement. Derrière le capot, des méthodes d'instance getter et setter sont créées pour que les champs soient accessibles. L'appel des méthodes d'instance est techniquement plus coûteux que celui des méthodes statiques.

public class DbConstants {
    companion object {
        val TABLE_USER_ATTRIBUTE_EMPID = "_id"
        val TABLE_USER_ATTRIBUTE_DATA = "data"
    }

Au lieu de cela, définissez les constantes dans object .

Pratique recommandée :

object DbConstants {
        const val TABLE_USER_ATTRIBUTE_EMPID = "_id"
        const val TABLE_USER_ATTRIBUTE_DATA = "data"
}

et y accéder globalement comme ceci : DbConstants.TABLE_USER_ATTRIBUTE_EMPID

0 votes

Un objet compagnon n'est-il pas un cas particulier d'objet ? Comment un const val dans un objet compagnon soit différent d'un const val dans un objet ordinaire (c'est-à-dire que la seule différence entre vos exemples semble être le fait que vous avez omis const dans le cas de l'objet compagnon - si vous ajoutez const les exemples devraient avoir les mêmes performances)

1 votes

@ErwinBolwidt Je pense que le point de @sudesh est que l'on ne devrait pas utiliser la conception classe-enveloppe-compagnon-objet lorsque le seul but de la structure est de fournir un espace de nom pour certaines valeurs constantes. Mais si votre structure a besoin d'être instanciable et d'enfermer également quelques const val en déclarant un companion object est correct.

11 votes

@ErwinBolwidt : sudesh a raison, le bytecode généré pour les objets compagnons implique la création d'objets supplémentaires avec des getters sous le capot. Pour une bonne explication avec des exemples décompilés en Kotlin, voir blog.egorand.me/où-est-ce-que-je-mets-mes-constantes-en-kotlin ?

164voto

AaRiF Points 1191

En Kotlin, si vous voulez créer les constantes locales qui sont censées être utilisées dans la classe, vous pouvez les créer comme suit

val MY_CONSTANT = "Constants"

Et si vous voulez créer une constante publique en kotlin comme public static final en java, vous pouvez le créer comme suit.

companion object{

     const val MY_CONSTANT = "Constants"

}

3 votes

Comment puis-je l'utiliser dans un fichier séparé comme un nouveau fichier nommé Constants.kt ou comment ?

2 votes

J'utilise un fichier pour les constantes. J'y garde toutes mes constantes.

3 votes

Vous n'avez pas besoin de la companion object Je pense que la réponse de @piotrpo devrait être la réponse acceptée.

68voto

A.Mamode Points 121

Tout d'abord la convention de dénomination des constantes en Kotlin est la même qu'en java (par exemple : MY_CONST_IN_UPPERCASE).

Comment dois-je le créer ?

1. Comme valeur de premier niveau (recommandé)

Vous devez juste mettre votre const à l'extérieur de votre déclaration de classe.

Deux possibilités : Déclarez vos constantes dans votre fichier de classe (vos constantes ont une relation claire avec votre classe).

private const val CONST_USED_BY_MY_CLASS = 1

class MyClass { 
    // I can use my const in my class body 
}

Créez un fichier constants.kt dédié où stocker ces constantes globales (Ici, vous voulez utiliser vos constantes largement à travers votre projet) :

package com.project.constants
const val URL_PATH = "https:/"

Il vous suffit ensuite de l'importer là où vous en avez besoin :

import com.project.constants

MyClass {
    private fun foo() {
        val url = URL_PATH
        System.out.print(url) // https://
    }
}

2. Le déclarer dans un objet compagnon (ou une déclaration d'objet)

C'est beaucoup moins plus propre car sous le capot, lorsque le bytecode est généré, un objet inutile est créé :

MyClass {
    companion object {
        private const val URL_PATH = "https://"
        const val PUBLIC_URL_PATH = "https://public" // Accessible in other project files via MyClass.PUBLIC_URL_PATH
    }
}

Encore pire. si vous le déclarez comme une val au lieu d'une const (le compilateur générera un objet inutile + une fonction inutile) :

MyClass {
    companion object {
        val URL_PATH = "https://"
    }
}

Note :

En Kotlin, const ne peut contenir que des types primitifs. Si vous voulez lui passer une fonction, vous devez ajouter l'annotation @JvmField. Au moment de la compilation, il sera transformé en variable publique static final. Mais c'est plus lent qu'avec un type primitif. Essayez de l'éviter.

@JvmField val foo = Foo()

2 votes

Cela devrait être la réponse acceptée. de toute façon, dans un cas comme : public static final Pattern REGEX_NOTEMPTY = Pattern.compile(".+") ? ???

0 votes

Où est-ce "recommandé" ? Vous avez un lien vers une ressource officielle sur Kotlin ?

0 votes

Quand j'ai fait quelque chose comme private const val CONST_USED_BY_MY_CLASS = 1 au-dessus de la définition de classe comme vous l'avez suggéré, Android studio 4.1.1 a commencé à afficher mon fichier *.kt dans lequel j'ai ajouté cette ligne comme "non résolue" dans l'arbre du projet. Cela n'a pas eu d'effet sur la compilation, mais une fois que je l'ai remarqué, c'est devenu très ennuyeux. J'espère qu'il sera bientôt corrigé

27voto

piotrpo Points 3935

Les valeurs connues au moment de la compilation peuvent (et à mon avis devraient) être marquées comme constantes.

Les conventions de nommage doivent suivre celles de Java et doivent être correctement visibles lorsqu'elles sont utilisées à partir du code Java (c'est quelque peu difficile à réaliser avec les objets compagnons, mais bon).

Les déclarations de constantes appropriées sont :

const val MY_CONST = "something"
const val MY_INT = 1

3 votes

Naming conventions should follow Java ones - Pourquoi ?

4 votes

Kotlin suit généralement les conventions Java par défaut, sauf indication contraire, afin de faciliter l'interopérabilité.

4 votes

C'est spécifié comme ça dans la documentation @Jodimoro kotlinlang.org/docs/reference/coding-conventions.html

27voto

Abdul Wadood Points 618

Vous n'avez pas besoin d'une classe, d'un objet ou d'un objet compagnon pour déclarer des constantes en Kotlin. Vous pouvez simplement déclarer un fichier contenant toutes les constantes (par exemple Constantes.kt ou vous pouvez également les placer dans n'importe quel fichier Kotlin existant) et déclarer directement les constantes dans le fichier. Les constantes connues au moment de la compilation doivent être marquées de la mention const .

Donc, dans ce cas, ça devrait l'être :

const val MY_CONST = "something"

et ensuite vous pouvez importer la constante en utilisant :

import package_name.MY_CONST

Vous pouvez vous référer à ce lien

23 votes

Les constantes doivent se trouver dans la classe à laquelle elles sont liées. Si vous créez une classe 'Constantes', vous finirez par avoir des centaines de constantes à l'intérieur. Par exemple, MAX_WIDTH, MAX_HEIGHT doivent être dans la classe Screen pour que vous puissiez y accéder logiquement : Screen.MAX_WIDTH et vous n'avez pas besoin de mettre Constants.SCREEN_MAX_WIDTH qui sera dupliqué avec Constantes.SCR_MAX_W et Constantes.MAX_WIDTH dans 2 ans parce que PERSONNE ne fait défiler des centaines/des milliers de lignes vers le bas lorsqu'il appuie sur Ctrl+espace pour la complétion automatique. Sérieusement : ne le faites pas. Cela mène à la non-maintenabilité.

1 votes

@inigoD C'est vrai si vous utilisez la constante à un seul endroit ou seulement dans les enfants, mais c'est rarement le cas. Si vous mettez la constante dans une classe obscure puis vous l'oubliez ou plus probablement vous reprenez une base de code, vous pourriez les dupliquer. Ou bien il n'est pas évident de savoir où les mettre. La source ou la destination ? Vous pouvez créer plusieurs fichiers de constantes, qui sont faciles à trouver. Un pour les clés de préférence, un pour les clés de requête, un pour les constantes de vue, etc.

2 votes

@Herrbert74 Je suis désolé mais je ne suis pas d'accord avec vous. Je suis d'accord sur le fait que parfois il peut être difficile de trouver lequel est, mais une place constante devrait toujours être la classe qui est plus liée à elle. Et les sauvegarder au hasard dans un fichier de nombres aléatoires n'est pas le meilleur moyen si vous souhaitez les retrouver plus tard... Vous argumenterez qu'elles ne devraient pas être stockées au hasard mais dans des paquets auxquels les constantes sont liées, mais ce n'est qu'une excuse pour ne pas les mettre dans les classes auxquelles elles sont liées, ce qui est, en fin de compte, leur place...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X