Como é recomendado criar constantes no Kotlin? E qual é a convenção de nomenclatura? Eu não encontrei isso na documentação.
companion object {
//1
val MY_CONST = "something"
//2
const val MY_CONST = "something"
//3
val myConst = "something"
}
Ou ...?
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.Respostas:
No Kotlin, se você deseja criar as constantes locais que devem ser usadas na classe, crie-as como abaixo
E se você deseja criar uma constante pública no kotlin como public static final em java, você pode criá-la da seguinte maneira.
fonte
Constants.kt
ou como?companion object
que eu acho @piotrpo resposta deve ser o único aceiteEvite usar objetos complementares. Por trás do capô, os métodos de instância getter e setter são criados para que os campos sejam acessíveis. Chamar métodos de instância é tecnicamente mais caro do que chamar métodos estáticos.
Em vez disso, defina as constantes em
object
.Prática recomendada :
e acesse-os globalmente assim:
DbConstants.TABLE_USER_ATTRIBUTE_EMPID
fonte
const val
objeto complementar em um objeto complementar pode ser diferente de umconst val
objeto comum (ou seja, a única diferença entre seus exemplos parece ser que você omitiuconst
no caso do objeto complementar - se você adicionarconst
, os exemplos devem ter o mesmo desempenho)const val
s, declarar acompanion object
está correto.Primeiro , a convenção de nomenclatura no Kotlin para constantes é a mesma que no java (por exemplo: MY_CONST_IN_UPPERCASE).
Como devo criá-lo?
1. Como um valor de nível superior (recomendado)
Você apenas precisa colocar sua const fora da declaração de classe.
Duas possibilidades : declarar sua const no seu arquivo de classe (sua const tem uma relação clara com sua classe)
Crie um arquivo constants.kt dedicado onde armazenar essas const globais (aqui você deseja usar sua const amplamente em todo o projeto):
Então você só precisa importá-lo onde precisar:
2. Declare-o em um objeto complementar (ou em uma declaração de objeto)
Isso é muito menos limpo porque, sob o capô, quando o bytecode é gerado, um objeto inútil é criado:
Pior ainda, se você o declarar como um val em vez de uma const (o compilador gerará um objeto inútil + uma função inútil):
Nota :
No kotlin, const pode conter apenas tipos primitivos. Se você deseja passar uma função para ela, é necessário adicionar a anotação @JvmField. No momento da compilação, ele será transformado como uma variável final estática pública. Mas é mais lento do que com um tipo primitivo. Tente evitá-lo.
fonte
Valores conhecidos em tempo de compilação podem (e na minha opinião deveriam) ser marcados como constantes.
As convenções de nomenclatura devem seguir as Java e devem estar visíveis quando usadas a partir do código Java (é algo difícil de ser alcançado com objetos complementares, mas de qualquer maneira).
As declarações constantes apropriadas são:
fonte
Naming conventions should follow Java ones
- porque?If in doubt, default to the Java Coding Conventions
Você não precisa de uma classe, um objeto ou um objeto complementar para declarar constantes no Kotlin. Você pode simplesmente declarar um arquivo contendo todas as constantes (por exemplo, Constants.kt ou também pode colocá-las dentro de qualquer arquivo Kotlin existente) e declarar diretamente as constantes dentro do arquivo. As constantes conhecidas em tempo de compilação devem ser marcadas com
const
.Portanto, neste caso, deve ser:
const val MY_CONST = "something"
e então você pode importar a constante usando:
import package_name.MY_CONST
Você pode consultar este link
fonte
Se você colocar o seu
const val valName = valValue
antes do nome da classe, dessa maneira ele criará umpublic static final YourClass.Kt
que terão ospublic static final
valores.Kotlin :
Java descompilado:
fonte
você tem duas opções: pode usar a
const
palavra-chave ou a@JvmField
que faz dela uma constante final estática de java.Se você usar a
@JvmField
anotação, depois que ela compilar, a constante será inserida para você da maneira que você chamaria em java.Assim como você chamaria em java, o compilador substituirá isso quando você chamar a constante complementar no código.
No entanto, se você usar a palavra-chave const, o valor da constante será incorporado. Por inline, quero dizer que o valor real é usado após a compilação.
Então, para resumir aqui, é o que o compilador fará por você:
fonte
O valor estático e constante de Kotlin e o método declaram
}
Acesse valor em qualquer lugar
fonte
Assim
val
, variáveis definidas com aconst
palavra - chave são imutáveis. A diferença aqui é que elaconst
é usada para variáveis conhecidas em tempo de compilação.Declarar uma variável
const
é muito parecido com o uso dastatic
palavra - chave em Java.Vamos ver como declarar uma variável const no Kotlin:
E o código análogo escrito em Java seria:
Adicionando às respostas acima -
Campos estáticos
Geralmente esses campos são particulares, mas podem ser expostos de uma das seguintes maneiras:
@JvmField
anotação;lateinit
modificador;const
modificador.Mais detalhes aqui - https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields
fonte
Algo que não é mencionado em nenhuma das respostas é a sobrecarga de uso
companion objects
. Como você pode ler aqui , os objetos complementares são de fato objetos e a criação deles consome recursos. Além disso, pode ser necessário executar mais de uma função getter toda vez que você usa sua constante. Se tudo o que você precisa são algumas constantes primitivas, provavelmente será melhor usá-loval
para obter um melhor desempenho e evitar ocompanion object
.TL; DR; do artigo:
O uso do objeto complementar realmente transforma esse código
Nesse código:
Portanto, tente evitá-los.
fonte
constantes locais:
Constantes globais:
acessar MyConstants.NAME
fonte
Existem algumas maneiras de definir constantes no Kotlin,
Usando objeto complementar
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:
Quando você cria suas constantes usando o objeto complementar e vê o código de código descompilado , verá algo como abaixo,
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,
Novamente, se você vir a versão descompilada do código de bytes do snippet acima, encontrará algo parecido com isto,
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,
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.
Portanto, esta é a melhor maneira de criar constantes.
fonte
Para primitivas e Strings:
Para outros casos:
Exemplo:
fonte