Quelle est la différence entre «const» et «val»?

276

J'ai récemment lu sur le constmot - clé, et je suis tellement confus! Je ne trouve aucune différence entre constet le valmot clé, je veux dire que nous pouvons utiliser les deux pour créer une variable immuable, y a-t-il autre chose qui me manque?

Mathew Hany
la source

Réponses:

388

consts sont des constantes de temps de compilation. Cela signifie que leur valeur doit être affectée pendant la compilation, contrairement à vals, où elle peut être effectuée lors de l'exécution.

Cela signifie que consts ne peut jamais être affecté à une fonction ou à un constructeur de classe, mais uniquement à une Stringou primitive.

Par exemple:

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

const val bar = "Hello world"           //Also okay
Luka Jacobowitz
la source
3
Et quelque chose comme ça: const val foo = "Hello world"et val bar = "Hello world"? Sont-ils les mêmes?
Mathew Hany
5
@MathewHany, du moins pas en termes de bytecode, voir: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
hotkey
4
Je pense que les constvaleurs seront juste complètement intégrées lors de la compilation.
Luka Jacobowitz
102
Cela soulève une autre question: pourquoi Kotlin a-t-il besoin const valau lieu de juste const? Il me semble que le valmot-clé est totalement superflu dans ce contexte, car const varserait absurde à première vue.
Eric Lloyd
18
@EricLloyd With const val, constest un modificateur sur valplutôt qu'un mot clé. Modificateurs> mots-clés. D' autres exemples de cette même conception sont annotation/enum/data class, private val, inline fun, etc.
Aro
38

Pour ajouter à la réponse de Luka:

Constantes de compilation

Les propriétés dont la valeur est connue au moment de la compilation peuvent être marquées comme constantes de temps de compilation à l'aide du modificateur const. Ces propriétés doivent répondre aux exigences suivantes:

Ces propriétés peuvent être utilisées dans les annotations.

Source: documentation officielle

EPadronU
la source
22

Vous pouvez transformer le Kotlin en Java. Ensuite, vous pouvez voir que const a un modificateur statique de plus que val . Le code simple comme celui-ci.

Kotlin:

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

Vers Java (partie):

@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
la source
2
Quelqu'un pourrait-il indiquer dans un commentaire pourquoi cette réponse a été rejetée à l'oubli?
James Jordan Taylor
3
@JamesJordanTaylor J'ai voté positivement. Mais je suppose que c'est parce que certaines personnes ne l'ont pas lu attentivement, et d'un coup d'œil, cette réponse semble parler de la façon de convertir de java en kotlin, ce qui serait hors sujet.
user1032613
2
Que se passe-t-il s'il constest supprimé, produira-t-il un fichier Java différent?
DYS
2
@DYS: Je pense que cela supprimera le "statique" et ce sera juste la chaîne finale publique str = "bonjour";
Varun Ajay Gupta
5

Les deux valet constsont immuables.

constest utilisé pour déclarer les constantes au moment de la compilation, tandis que valpour les constantes au moment de l'exécution.

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

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

const kotlin à Java

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

val kotlin à Java

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

En langage simple

  1. La valeur de la variable const est connue au moment de la compilation.
  2. La valeur de val est utilisée pour définir des constantes au moment de l'exécution.

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

En effet, getCar () est évaluée au moment de l'exécution et affecte la valeur à Car.

Aditionellement -

  1. val est en lecture seule signifie immuable qui est connu au moment de l'exécution
  2. var est mutable qui est connu au moment de l'exécution
  3. const sont immuables et variables qui sont connues au moment de la compilation
Shivam Tripathi
la source
3

En kotlin, constet les valdeux représentent l'immuabilité et les valeurs en lecture seule et agissent comme finalmot-clé en java.

valLe mot clé doit être utilisé pour déclarer les valeurs d'exécution et le constmot clé doit être utilisé pour déclarer les valeurs d'heure de compilation.

Gardez à l'esprit que const ne doit être utilisé qu'avec des types de données primitifs et non pour la fonction et les constructeurs.

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
la source