Il existe plusieurs façons de définir des constantes dans Kotlin,
Utilisation d'un objet compagnon
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
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,
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 et peuvent, par exemple, implémenter des interfaces.
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,
ClassName.Companion Companion = ClassName.Companion.$$INSTANCE;
@NotNull
String ITEM1 = "item1";
@NotNull
String ITEM2 = "item2";
public static final class Companion {
@NotNull
private static final String ITEM1 = "item1";
@NotNull
public static final String ITEM2 = "item2";
// $FF: synthetic field
static final ClassName.Companion $$INSTANCE;
private Companion() {
}
static {
ClassName.Companion var0 = new ClassName.Companion();
$$INSTANCE = var0;
}
}
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,
object ApiConstants {
val ITEM1: String = "item1"
}
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,
public final class ApiConstants {
private static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
public final String getITEM1() {
return ITEM1;
}
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
CONNECT_TIMEOUT = "item1";
}
}
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,
object ApiConstants {
const val ITEM1: String = "item1"
}
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.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
C'est donc la meilleure façon de créer des constantes.
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.