Qual é a diferença entre "const" e "val"?

276

Li recentemente sobre a constpalavra - chave e estou muito confuso! Não consigo encontrar nenhuma diferença entre conste a valpalavra - chave; quero dizer, podemos usar os dois para criar uma variável imutável. Existe alguma outra coisa que estou perdendo?

Mathew Hany
fonte

Respostas:

388

consts são constantes de tempo de compilação. Significando que seu valor deve ser atribuído durante o tempo de compilação, diferente de vals, onde isso pode ser feito em tempo de execução.

Isso significa que esses constnunca podem ser atribuídos a uma função ou a qualquer construtor de classe, mas apenas a Stringou primitivo.

Por exemplo:

const val foo = complexFunctionCall()   //Not okay
val fooVal = complexFunctionCall()  //Okay

const val bar = "Hello world"           //Also okay
Luka Jacobowitz
fonte
3
Que tal algo assim: const val foo = "Hello world"e val bar = "Hello world"? Eles são os mesmos?
precisa
5
@ MathewHany, pelo menos não em termos de bytecode, consulte: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
hotkey
4
Eu acho que os constvalores serão completamente incorporados durante a compilação.
Luka Jacobowitz
102
Isso levanta outra questão: por que Kotlin exige, em const valvez de apenas const? Parece-me que a valpalavra-chave é totalmente supérflua nesse contexto, pois const varseria absurda.
Eric Lloyd
18
@ EricLloyd With const val, consté um modificador em valvez de uma palavra-chave. Modificadores> palavras-chave. Mais exemplos deste mesmo projeto são, annotation/enum/data class, private val, inline fun, etc.
Aro
38

Apenas para adicionar à resposta de Luka:

Constantes em tempo de compilação

As propriedades cujo valor é conhecido no tempo de compilação podem ser marcadas como constantes de tempo de compilação usando o modificador const. Essas propriedades precisam atender aos seguintes requisitos:

Essas propriedades podem ser usadas em anotações.

Fonte: documentação oficial

EPadronU
fonte
21

Você pode transformar o Kotlin em Java. Então você pode ver que const tem mais um modificador estático que val . O código simples como este.

Kotlin:

const val str = "hello"
class SimplePerson(val name: String, var age: Int)

Para Java (parte):

@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
fonte
2
Alguém poderia declarar em um comentário por que essa resposta foi rebaixada ao esquecimento?
James Jordan Taylor
3
@JamesJordanTaylor I votou positivamente. Mas suponho que é porque algumas pessoas não leram com atenção e, rapidamente, essa resposta parece estar falando sobre como converter de java para kotlin, o que seria fora de tópico.
usar o seguinte comando
2
E se constfor removido, ele produzirá um arquivo Java diferente?
DYS
2
@ DYS: Eu acho que ele irá remover o "estático" e será apenas público final String str = "hello";
Varun Ajay Gupta
5

Ambos vale constsão imutáveis.

consté usado para declarar constantes em tempo de compilação, enquanto valpara constantes em tempo de execução.

const val VENDOR_NAME = "Kifayat Pashteen"  // Assignment done at compile-time

val PICon = getIP()  // Assignment done at run-time
Kifayat Ullah
fonte
4

const kotlin para Java

const val Car_1 = "BUGATTI" // final static String Car_1 = "BUGATTI";

val kotlin para Java

val Car_1 = "BUGATTI"   // final String Car_1 = "BUGATTI";

Em linguagem simples

  1. O valor da variável const é conhecido em tempo de compilação.
  2. O valor de val é usado para definir constantes no tempo de execução.

Exemplo 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"
}

Isso ocorre porque getCar () é avaliado em tempo de execução e atribui o valor a Car.

Além disso -

  1. val é somente leitura significa imutável que é conhecido em tempo de execução
  2. var é mutável que é conhecido em tempo de execução
  3. const são imutáveis ​​e variáveis ​​conhecidas em tempo de compilação
Shivam Tripathi
fonte
3

No kotlin, conste valambos representam a imutabilidade e os valores somente leitura e agem como finalpalavra-chave em java.

valA palavra-chave deve ser usada para declarar valores de tempo de execução e a constpalavra - chave deve ser usada para declarar valores de tempo de compilação.

Lembre-se de que const deve ser usado apenas com tipos de dados primitivos, não para funções e construtores.

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
fonte