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

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
Luka Jacobowitz
fuente
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

EPadronU
fuente
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;
   }
}
Jin Wang
fuente
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
Kifayat Ullah
fuente
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
Shivam Tripathi
fuente
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

Ajay Vishwakarma
fuente