¿Cuál es la diferencia entre "const" y "val"?


276

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:


388

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

3
¿Qué pasa con algo como esto: const val foo = "Hello world"y val bar = "Hello world"? ¿Son lo mismo?
Mathew Hany

55
@MathewHany, al menos no en términos de bytecode, consulte: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
tecla de

44
Creo que los constvalores estarán completamente alineados durante la compilación.
Luka Jacobowitz

102
Esto plantea otra pregunta: ¿por qué Kotlin requiere en 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.
Eric Lloyd

18
@EricLloyd With 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.
Aro

38

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:

Dichas propiedades se pueden usar en anotaciones.

Fuente: documentación oficial


22

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;
   }
}

2
¿Podría alguien decir en un comentario por qué esta respuesta fue rechazada al olvido?
James Jordan Taylor el

3
@JamesJordanTaylor Voté. Pero supongo que es porque algunas personas no lo leyeron con cuidado, y de un vistazo esta respuesta parece estar hablando de cómo convertir de Java a Kotlin, lo que estaría fuera de tema.
user1032613

2
¿Qué pasa si constse elimina, producirá un archivo Java diferente?
DYS

2
@DYS: Creo que eliminará la "estática" y será solo public final String str = "hello";
Varun Ajay Gupta

5

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

4

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

  1. El valor de la variable const se conoce en tiempo de compilación.
  2. El valor de val se utiliza para definir constantes en tiempo de ejecución.

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 -

  1. val es de solo lectura significa inmutable que se conoce en tiempo de ejecución
  2. var es mutable que se conoce en tiempo de ejecución
  3. const son inmutables y variables que se conocen en tiempo de compilación

3

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.