Recientemente leí sobre la constpalabra clave, ¡y estoy tan confundido! No puedo encontrar ninguna diferencia entre consty la valpalabra clave, quiero decir que podemos usar ambas para hacer una variable inmutable, ¿hay algo más que me falta?
Recientemente leí sobre la constpalabra clave, ¡y estoy tan confundido! No puedo encontrar ninguna diferencia entre consty la valpalabra clave, quiero decir que podemos usar ambas para hacer una variable inmutable, ¿hay algo más que me falta?
Respuestas:
consts son constantes de tiempo de compilación. Lo que significa que su valor debe asignarse durante el tiempo de compilación, a diferencia de vals, donde se puede hacer en tiempo de ejecución.
Esto significa que consts nunca puede asignarse a una función ni a ningún constructor de clases, sino solo a una Stringo 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?
constvalores estarán completamente alineados durante la compilación.
const vallugar de solo const? Me parece que la valpalabra clave es totalmente superflua en este contexto, ya const varque sería absurda en su aspecto.
const val, constes un modificador en vallugar 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;
}
}
constse elimina, producirá un archivo Java diferente?
Ambos valy constson inmutables.
constse usa para declarar constantes de tiempo de compilación, mientras que valpara 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, consty valambos representan la inmutabilidad y los valores de solo lectura y actúan como finalpalabra 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