Existem algumas maneiras de definir constantes no Kotlin,
Usando objeto complementar
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
você pode usar o bloco de objetos complementares acima em qualquer classe e definir todos os seus campos dentro desse próprio bloco. Mas há um problema com essa abordagem, a documentação diz:
mesmo que os membros de objetos complementares pareçam membros estáticos em outros idiomas, em tempo de execução, eles ainda são membros de instância de objetos reais e podem, por exemplo, implementar interfaces.
Quando você cria suas constantes usando o objeto complementar e vê o código de código descompilado , verá algo como abaixo,
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;
}
}
A partir daqui, você pode ver facilmente o que a documentação dizia, mesmo que os membros de objetos complementares pareçam membros estáticos em outros idiomas, em tempo de execução esses ainda são membros de instância de objetos reais. Está fazendo um trabalho extra do que o necessário.
Agora vem outra maneira, na qual não precisamos usar objetos complementares, como abaixo,
object ApiConstants {
val ITEM1: String = "item1"
}
Novamente, se você vir a versão descompilada do código de bytes do snippet acima, encontrará algo parecido com isto,
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";
}
}
Agora, se você vir o código descompilado acima, está criando o método get para cada variável. Este método get não é necessário.
Para se livrar desses métodos get , você deve usar const before val como abaixo,
object ApiConstants {
const val ITEM1: String = "item1"
}
Agora, se você vir o código descompilado do snippet acima, achará mais fácil ler, pois faz a menor conversão em segundo plano para o seu 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;
}
}
Portanto, esta é a melhor maneira de criar constantes.
public static final
campo em Java, useconst val
em seu objeto complementar. Se você deseja umprivate static final
campo e um getter público, useval
em seu objeto complementar.