Comment est-il recommandé de créer des constantes dans 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 ...?
public static final
champ en Java, utilisezconst val
dans votre objet compagnon. Si vous voulez unprivate static final
champ et un getter public, utilisezval
dans votre objet compagnon.Réponses:
Dans Kotlin, si vous souhaitez créer les constantes locales qui sont censées être utilisées dans la classe, vous pouvez la créer comme ci-dessous
Et si vous souhaitez créer une constante publique dans kotlin comme public static final en java, vous pouvez la créer comme suit.
la source
Constants.kt
ou comment?companion object
réponse Je pense que @piotrpo devrait être celle acceptéeÉvitez d'utiliser des objets compagnons. Derrière le capot, des méthodes d'instance getter et setter sont créées pour que les champs soient accessibles. L'appel de méthodes d'instance est techniquement plus coûteux que l'appel de méthodes statiques.
Définissez plutôt les constantes dans
object
.Pratique recommandée :
et accédez-y globalement comme ceci:
DbConstants.TABLE_USER_ATTRIBUTE_EMPID
la source
const val
dans un objet compagnon peut-il être différent de aconst val
dans un objet ordinaire (c'est-à-dire que la seule différence entre vos exemples semble être que vous avez omisconst
dans le cas de l'objet compagnon - si vous ajoutezconst
, les exemples devraient avoir les mêmes performances)const val
s, déclarer acompanion object
est correct.Tout d'abord , la convention de dénomination dans Kotlin pour les constantes est la même que dans java (par exemple: MY_CONST_IN_UPPERCASE).
Comment dois-je le créer?
1. En tant que valeur de niveau supérieur (recommandé)
Il vous suffit de mettre votre const en dehors de votre déclaration de classe.
Deux possibilités : Déclarez votre const dans votre fichier de classe (votre const a une relation claire avec votre classe)
Créez un fichier dédié constants.kt où stocker ces const globales (ici, vous souhaitez utiliser votre const largement dans votre projet):
Ensuite, il vous suffit de l'importer là où vous en avez besoin:
2. Déclarez-le dans un objet compagnon (ou une déclaration d'objet)
C'est beaucoup moins propre car sous le capot, lorsque le bytecode est généré, un objet inutile est créé:
Pire encore si vous le déclarez comme un val au lieu d'un const (le compilateur générera un objet inutile + une fonction inutile):
Remarque :
Dans kotlin, const ne peut contenir que des types primitifs. Si vous souhaitez lui transmettre une fonction, vous devez ajouter l'annotation @JvmField. Au moment de la compilation, il sera transformé en une variable finale statique publique. Mais c'est plus lent qu'avec un type primitif. Essayez de l'éviter.
la source
Les valeurs connues au moment de la compilation peuvent (et à mon avis devraient) être marquées comme constantes.
Les conventions de dénomination doivent suivre celles de Java et doivent être correctement visibles lorsqu'elles sont utilisées à partir du code Java (c'est en quelque sorte difficile à réaliser avec des objets compagnons, mais de toute façon).
Les déclarations de constantes appropriées sont:
la source
Naming conventions should follow Java ones
- Pourquoi?If in doubt, default to the Java Coding Conventions
Vous n'avez pas besoin d'une classe, d'un objet ou d'un objet compagnon pour déclarer des constantes dans Kotlin. Vous pouvez simplement déclarer un fichier contenant toutes les constantes (par exemple Constants.kt ou vous pouvez également les placer dans n'importe quel fichier Kotlin existant) et déclarer directement les constantes à l'intérieur du fichier. Les constantes connues au moment de la compilation doivent être marquées de
const
.Donc, dans ce cas, cela devrait être:
const val MY_CONST = "something"
puis vous pouvez importer la constante en utilisant:
import package_name.MY_CONST
Vous pouvez vous référer à ce lien
la source
Si vous mettez votre
const val valName = valValue
avant le nom de la classe, cela créera unpublic static final YourClass.Kt
qui aura lespublic static final
valeurs.Kotlin :
Java décompilé:
la source
vous avez deux choix, vous pouvez utiliser le
const
mot-clé ou utiliser le@JvmField
qui en fait une constante finale statique de Java.Si vous utilisez l'
@JvmField
annotation, une fois compilée, la constante est insérée pour vous comme vous l'appeleriez en java.Tout comme vous l'appeleriez en java, le compilateur remplacera cela pour vous lorsque vous appelez la constante compagnon dans le code.
Cependant, si vous utilisez le mot-clé const, la valeur de la constante est insérée. Par inline, je veux dire que la valeur réelle est utilisée après sa compilation.
Donc, pour résumer, voici ce que le compilateur fera pour vous:
la source
Déclaration de la valeur et de la méthode statiques et constantes de Kotlin
}
Accédez à la valeur n'importe où
la source
Comme
val
, les variables définies avec leconst
mot-clé sont immuables. La différence ici est qu'elleconst
est utilisée pour les variables connues au moment de la compilation.Déclarer une variable
const
est un peu comme utiliser lestatic
mot - clé en Java.Voyons comment déclarer une variable const dans Kotlin:
Et le code analogue écrit en Java serait:
Ajout aux réponses ci-dessus -
Champs statiques
Habituellement, ces champs sont privés, mais ils peuvent être exposés de l'une des manières suivantes:
@JvmField
annotation;lateinit
modificateur;const
modificateur.Plus de détails ici - https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields
la source
Quelque chose qui n'est mentionné dans aucune des réponses est la surcharge d'utilisation
companion objects
. Comme vous pouvez le lire ici , les objets compagnons sont en fait des objets et leur création consomme des ressources. De plus, vous devrez peut-être utiliser plusieurs fonctions getter chaque fois que vous utilisez votre constante. Si tout ce dont vous avez besoin est de quelques constantes primitives, vous serez probablement mieux d'utiliserval
pour obtenir de meilleures performances et éviter lecompanion object
.TL, DR; de l'article:
L'utilisation d'un objet compagnon transforme ce code
Dans ce code:
Alors essayez de les éviter.
la source
constantes locales:
Constantes globales:
accéder à MyConstants.NAME
la source
Il existe plusieurs façons de définir des constantes dans Kotlin,
Utilisation d'un objet compagnon
vous pouvez utiliser le bloc d'objet compagnon ci-dessus dans n'importe quelle classe et définir tous vos champs à l'intérieur de ce bloc lui-même. Mais il y a un problème avec cette approche, dit la documentation,
Lorsque vous créez vos constantes à l'aide d'un objet compagnon et que vous voyez le bytecode décompilé , vous aurez quelque chose comme ci-dessous,
De là, vous pouvez facilement voir ce que dit la documentation, même si les membres des objets compagnons ressemblent à des membres statiques dans d'autres langages, au moment de l'exécution, ils sont toujours des membres d'instance d'objets réels. Cela fait un travail supplémentaire que nécessaire.
Vient maintenant une autre façon, où nous n'avons pas besoin d'utiliser un objet compagnon comme ci-dessous,
Encore une fois, si vous voyez la version décompilée du code d'octet de l'extrait de code ci-dessus, vous trouverez quelque chose comme ça,
Maintenant, si vous voyez le code décompilé ci-dessus, il crée une méthode get pour chaque variable. Cette méthode get n'est pas du tout requise.
Pour vous débarrasser de ces méthodes get , vous devez utiliser const avant val comme ci-dessous,
Maintenant, si vous voyez le code décompilé de l'extrait de code ci-dessus, vous le trouverez plus facile à lire car il effectue la moindre conversion en arrière-plan pour votre code.
C'est donc la meilleure façon de créer des constantes.
la source
Pour les primitives et les chaînes:
Pour les autres cas:
Exemple:
la source