¿Cómo se recomienda crear constantes en Kotlin? ¿Y cuál es la convención de nomenclatura? No he encontrado eso en la documentación.
companion object {
//1
val MY_CONST = "something"
//2
const val MY_CONST = "something"
//3
val myConst = "something"
}
O ...
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.Respuestas:
En Kotlin, si desea crear las constantes locales con las que se supone que deben usarse en la clase, puede crearlas como se muestra a continuación.
Y si desea crear una constante pública en kotlin como public static final en java, puede crearla de la siguiente manera.
fuente
Constants.kt
o cómo?companion object
respuesta Creo que @piotrpo debería ser la aceptadaEvite usar objetos de compañía. Detrás del capó, se crean métodos de instancia getter y setter para que los campos sean accesibles. Llamar a métodos de instancia es técnicamente más costoso que llamar a métodos estáticos.
En su lugar, defina las constantes en
object
.Práctica recomendada :
y acceder a ellos globalmente de esta manera:
DbConstants.TABLE_USER_ATTRIBUTE_EMPID
fuente
const val
objeto complementario ser diferente de unconst val
objeto común (es decir, la única diferencia entre sus ejemplos parece ser que omitióconst
en el caso del objeto complementario? Si agregaconst
, los ejemplos deberían tener el mismo rendimiento)const val
s, declarar acompanion object
es correcto.En primer lugar , la convención de nomenclatura en Kotlin para constantes es la misma que en Java (por ejemplo: MY_CONST_IN_UPPERCASE).
¿Cómo debo crearlo?
1. Como valor de nivel superior (recomendado)
Solo tiene que poner su constante fuera de su declaración de clase.
Dos posibilidades : declara tu constante en tu archivo de clase (tu constante tiene una relación clara con tu clase)
Cree un archivo dedicado constants.kt donde almacenar esas constantes globales (aquí desea utilizar su constante en todo su proyecto):
Luego solo tiene que importarlo donde lo necesite:
2. Declararlo en un objeto complementario (o una declaración de objeto)
Esto es mucho menos limpio porque debajo del capó, cuando se genera el código de bytes, se crea un objeto inútil:
Peor aún si lo declaras como un val en lugar de un const (el compilador generará un objeto inútil + una función inútil):
Nota :
En kotlin, const solo puede contener tipos primitivos. Si desea pasarle una función, debe agregar la anotación @JvmField. En tiempo de compilación, se transformará como una variable final estática pública. Pero es más lento que con un tipo primitivo. Intenta evitarlo.
fuente
Los valores conocidos en tiempo de compilación pueden (y en mi opinión deberían) marcarse como constantes.
Las convenciones de nomenclatura deben seguir a las de Java y deben ser visibles de manera adecuada cuando se usan desde el código de Java (de alguna manera es difícil de lograr con objetos complementarios, pero de todos modos).
Las declaraciones constantes adecuadas son:
fuente
Naming conventions should follow Java ones
- ¿por qué?If in doubt, default to the Java Coding Conventions
No necesita una clase, un objeto o un objeto complementario para declarar constantes en Kotlin. Puede declarar un archivo que contenga todas las constantes (por ejemplo, Constants.kt o también puede colocarlas dentro de cualquier archivo Kotlin existente) y declarar directamente las constantes dentro del archivo. Las constantes conocidas en tiempo de compilación deben marcarse con
const
.Entonces, en este caso, debería ser:
const val MY_CONST = "something"
y luego puedes importar la constante usando:
import package_name.MY_CONST
Puedes consultar este enlace
fuente
Si pones tu
const val valName = valValue
antes del nombre de la clase, de esta forma creará unpublic static final YourClass.Kt
eso tendrá lospublic static final
valores.Kotlin :
Java descompilado:
fuente
tiene dos opciones: puede usar la
const
palabra clave o usar la@JvmField
que la convierte en una constante final estática de java.Si usa la
@JvmField
anotación, luego de que se compila, la constante se pone para usted de la forma en que la llamaría en java.Al igual que lo llamarías en Java, el compilador lo reemplazará por ti cuando llames a la constante compañera en el código.
Sin embargo, si usa la palabra clave const, entonces el valor de la constante se alinea. Por en línea quiero decir que el valor real se usa después de compilar.
para resumir aquí es lo que el compilador hará por usted:
fuente
El valor y método estático y constante de Kotlin declaran
}
Acceda al valor desde cualquier lugar
fuente
Al igual
val
, las variables definidas con laconst
palabra clave son inmutables. La diferencia aquí es queconst
se usa para variables que se conocen en tiempo de compilación.Declarar una variable
const
es muy parecido a usar lastatic
palabra clave en Java.Veamos cómo declarar una variable const en Kotlin:
Y el código análogo escrito en Java sería:
Agregando a las respuestas anteriores -
Campos estáticos
Por lo general, estos campos son privados, pero pueden exponerse de una de las siguientes maneras:
@JvmField
anotación;lateinit
modificadorconst
modificadorMás detalles aquí: https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields
fuente
Algo que no se menciona en ninguna de las respuestas es la sobrecarga de uso
companion objects
. Como puede leer aquí , los objetos complementarios son de hecho objetos y su creación consume recursos. Además, es posible que deba realizar más de una función getter cada vez que use su constante. Si todo lo que necesita son unas pocas constantes primitivas, probablemente sea mejor usarlasval
para obtener un mejor rendimiento y evitarlascompanion object
.TL; DR; del artículo:
El uso de objetos complementarios en realidad convierte este código
En este código:
Así que trata de evitarlos.
fuente
constantes locales:
Constantes globales:
acceder a MyConstants.NAME
fuente
Hay algunas formas de definir constantes en Kotlin,
Usando objeto complementario
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:
Cuando cree sus constantes utilizando un objeto complementario y vea el código de bytes descompilado , verá algo como a continuación,
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,
Nuevamente, si ve la versión descompilada del código de bytes del fragmento anterior, encontrará algo como esto,
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,
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.
Entonces esta es la mejor manera de crear constantes.
fuente
Para primitivas y cadenas:
Para otros casos:
Ejemplo:
fuente