Hay algunas formas de definir constantes en Kotlin,
Usando objeto complementario
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
puede usar el bloque de objeto complementario anterior dentro de cualquier clase y definir todos sus campos dentro de este bloque. Pero hay un problema con este enfoque, la documentación dice:
aunque los miembros de los objetos complementarios se parecen a los miembros estáticos en otros idiomas, en el tiempo de ejecución siguen siendo miembros de objetos reales y, por ejemplo, pueden implementar interfaces.
Cuando cree sus constantes utilizando un objeto complementario y vea el código de bytes descompilado , verá algo como a continuación,
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;
}
}
Desde aquí puede ver fácilmente lo que dice la documentación, aunque los miembros de los objetos complementarios se vean como miembros estáticos en otros idiomas, en el tiempo de ejecución siguen siendo miembros de objetos reales. Está haciendo un trabajo adicional al requerido.
Ahora viene de otra manera, donde no necesitamos usar objetos complementarios como a continuación,
object ApiConstants {
val ITEM1: String = "item1"
}
Nuevamente, si ve la versión descompilada del código de bytes del fragmento anterior, encontrará algo como esto,
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";
}
}
Ahora, si ve el código descompilado anterior, está creando el método get para cada variable. Este método get no es obligatorio en absoluto.
Para deshacerse de estos métodos get , debe usar const antes de val como se muestra a continuación,
object ApiConstants {
const val ITEM1: String = "item1"
}
Ahora, si ve el código descompilado del fragmento anterior, le resultará más fácil de leer, ya que hace la menor conversión de fondo para su código.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
Entonces esta es la mejor manera de crear constantes.
public static final
campo en Java, utilíceloconst val
en su objeto complementario. Si desea unprivate static final
campo y un captador público, úseloval
en su objeto complementario.