Recientemente leí sobre la const
palabra clave, ¡y estoy tan confundido! No puedo encontrar ninguna diferencia entre const
y la val
palabra clave, quiero decir que podemos usar ambas para hacer una variable inmutable, ¿hay algo más que me falta?
Recientemente leí sobre la const
palabra clave, ¡y estoy tan confundido! No puedo encontrar ninguna diferencia entre const
y la val
palabra clave, quiero decir que podemos usar ambas para hacer una variable inmutable, ¿hay algo más que me falta?
Respuestas:
const
s son constantes de tiempo de compilación. Lo que significa que su valor debe asignarse durante el tiempo de compilación, a diferencia de val
s, donde se puede hacer en tiempo de ejecución.
Esto significa que const
s nunca puede asignarse a una función ni a ningún constructor de clases, sino solo a una String
o primitiva.
Por ejemplo:
const val foo = complexFunctionCall() //Not okay
val fooVal = complexFunctionCall() //Okay
const val bar = "Hello world" //Also okay
const val foo = "Hello world"
y val bar = "Hello world"
? ¿Son lo mismo?
const
valores estarán completamente alineados durante la compilación.
const val
lugar de solo const
? Me parece que la val
palabra clave es totalmente superflua en este contexto, ya const var
que sería absurda en su aspecto.
const val
, const
es un modificador en val
lugar de una palabra clave. Modificadores> palabras clave. Más ejemplos de este mismo diseño son, annotation/enum/data class
, private val
, inline fun
, etc.
Solo para agregar a la respuesta de Luka:
Constantes de tiempo de compilación
Las propiedades cuyo valor se conoce en tiempo de compilación se pueden marcar como constantes de tiempo de compilación utilizando el modificador const. Dichas propiedades deben cumplir los siguientes requisitos:
- Nivel superior o miembro de una declaración de objeto o un objeto complementario .
- Inicializado con un valor de tipo String o un tipo primitivo
- Sin captador personalizado
Dichas propiedades se pueden usar en anotaciones.
Fuente: documentación oficial
Puedes transformar el Kotlin a Java. Entonces puedes ver que const tiene un modificador estático más que val . El código simple como este.
Kotlin:
const val str = "hello"
class SimplePerson(val name: String, var age: Int)
A Java (porción):
@NotNull
public static final String str = "hello";
public final class SimplePerson {
@NotNull
private final String name;
private int age;
@NotNull
public final String getName() {
return this.name;
}
public final int getAge() {
return this.age;
}
public final void setAge(int var1) {
this.age = var1;
}
public SimplePerson(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.age = age;
}
}
const
se elimina, producirá un archivo Java diferente?
Ambos val
y const
son inmutables.
const
se usa para declarar constantes de tiempo de compilación, mientras que val
para constantes de tiempo de ejecución.
const val VENDOR_NAME = "Kifayat Pashteen" // Assignment done at compile-time
val PICon = getIP() // Assignment done at run-time
const kotlin a Java
const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";
val kotlin a Java
val Car_1 = "BUGATTI" // final String Car_1 = "BUGATTI";
En lenguaje sencillo
Ejemplo 1-
const val Car_1 = "BUGATTI" ✔
val Car_2 = getCar() ✔
const val Car_3 = getCar() ❌
//Because the function will not get executed at the compile time so it will through error
fun getCar(): String {
return "BUGATTI"
}
Esto se debe a que getCar () se evalúa en tiempo de ejecución y asigna el valor a Car.
Adicionalmente -
En kotlin, const
y val
ambos representan la inmutabilidad y los valores de solo lectura y actúan como final
palabra clave en java.
val
la palabra clave debe usarse para declarar valores de tiempo de ejecución y const
palabra clave debe usarse para declarar valores de tiempo de compilación.
Tenga en cuenta que const debe usarse solo con tipos de datos primitivos, no para funciones y constructores.
Example -
const val fun1 = anyFunctionOrConstructor() // it is not fine
val fun2 = anyFunctionOrConstructor() // it is perfectly fine
const val aa = "My String" // it is perfectly fine