341

I have recently read about the const keyword, and I'm so confused! I can't find any difference between const and the val keyword, I mean we can use both of them to make an immutable variable, is there anything else that I'm missing?

chancyWu
  • 12,898
  • 11
  • 56
  • 71
Mathew Hany
  • 9,598
  • 4
  • 16
  • 15
  • 1
    https://kotlinlang.org/docs/reference/properties.html#compile-time-constants – Michael Jun 02 '16 at 15:34
  • You can read this article https://www.android4dev.com/difference-between-var-val-and-const-in-kotlin/ or Watch this video https://www.youtube.com/watch?v=DQLrEGqSSI8&t=6s – Lokesh Desai Jun 05 '20 at 15:59

8 Answers8

479

consts are compile time constants. Meaning that their value has to be assigned during compile time, unlike vals, where it can be done at runtime.

This means, that consts can never be assigned to a function or any class constructor, but only to a String or primitive.

For example:

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

const val bar = "Hello world"           //Also okay
Gurwinder Singh
  • 35,652
  • 5
  • 39
  • 62
Luka Jacobowitz
  • 19,651
  • 5
  • 34
  • 54
  • 3
    What about something like this: `const val foo = "Hello world"` and `val bar = "Hello world"`? Are they the same? – Mathew Hany Jun 02 '16 at 15:32
  • 5
    @MathewHany, at least not in terms of bytecode, see: http://stackoverflow.com/questions/37482378/static-data-in-kotlin/37485356#37485356 – hotkey Jun 02 '16 at 15:34
  • 4
    I think `const` values will just be completely inlined during compilation. – Luka Jacobowitz Jun 02 '16 at 15:35
  • 127
    This begs another question: Why does Kotlin require `const val` instead of just `const`? It seems to me the `val` keyword is totally superfluous in this context, since `const var` would be absurd on its face. – Eric Lloyd Jun 08 '17 at 15:51
  • 3
    Then why the differentiation? Why can't the compiler determine if a value is a const and compute its value at compile time if it is? – Gonzalo Mar 23 '18 at 14:39
  • `const val` is underlined with red with a message: `Modifier 'const' is not applicable to 'local variable'` inside a function. – CoolMind Mar 26 '18 at 12:17
  • 27
    @EricLloyd With `const val`, `const` is a modifier on `val` rather than a keyword. Modifiers > keywords. More examples of this same design are, `annotation/enum/data class`, `private val`, `inline fun`, etc. – Aro Apr 02 '18 at 19:36
  • 1
    since consts are assigned at compile time, when the object is destroyed by GC will the constants be free or do they reside forever ? – j2emanue Jan 08 '19 at 11:15
  • @Aro So in other words, a constant modifying a constant. Yeah makes sense (rolls eyes). – AndroidDev May 27 '19 at 14:31
  • @EricLloyd A `const` is inlined by the compiler which you don't always want because it requires recompilation in order the change the value – Florian Walther Oct 09 '19 at 08:51
  • 2
    @FlorianWalther Yeah, that's kinda the idea -- I typically use `const`s for truly immutable values -- HTTP verbs, the value of Pi, etc. If it's a mutable or even configurable value, a `const` isn't the answer. – Eric Lloyd Oct 15 '19 at 06:22
  • seeing how Kotlin is superior because it reduces nosiness of unnecessary tings, "val" in "const val" is totally useless, unless of course you can write "const var" which is nonsense. – Dainius Jan 21 '21 at 08:01
42

Just to add to Luka's answer:

Compile-Time Constants

Properties the value of which is known at compile time can be marked as compile time constants using the const modifier. Such properties need to fulfill the following requirements:

Such properties can be used in annotations.

Source: Official documentation

Community
  • 1
  • 1
EPadronU
  • 1,453
  • 14
  • 15
27

You can transform the Kotlin to Java. Then you can see const has one more static modifier than val. The simple code like this.

Kotlin:

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

To Java(Portion):

@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
  • 483
  • 4
  • 6
15

const kotlin to Java

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

val kotlin to Java

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

In simple Language

  1. The value of the const variable is known at compile time.
  2. The value of val is used to define constants at run time.

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

This is because getCar() is evaluated at run time and assigns the value to Car.

Additionally -

  1. val is read-only means immutable that is known at run-time
  2. var is mutable that is known at run-time
  3. const are immutable and variables that are known at compile-time
Shivam Tripathi
  • 441
  • 5
  • 6
10

In kotlin, const and val both represents the immutability and read only values and act as final keyword in java.

val keyword must be used to declare for run time values and const keyword must be used to declare compile time values.

Keep in mind, const must be used only with primitive data types not for function and constructors.

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
7

Both val and const are immutable.

const is used to declare compile-time constants, whereas val for run-time constants.

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

val PICon = getIP()  // Assignment done at run-time
Kifayat Ullah
  • 361
  • 4
  • 13
1

val

Kotlin val keyword is for read-only properties in comparison with Kotlin var keyword. The other name for read-only property is immutable.

Kotlin code:

val variation: Long = 100L

Java equivalent looks like this:

final Long variation = 100L;


const val

We use const keyword for immutable properties too. const is used for properties that are known at compile-time. That's the difference. Take into consideration that const property must be declared globally.

Kotlin code (in playground):

const val WEBSITE_NAME: String = "Google"

fun main() {    
    println(WEBSITE_NAME)
}

Java code (in playground):

class Playground {

    final static String WEBSITE_NAME = "Google";

    public static void main(String[ ] args) {
        System.out.println(WEBSITE_NAME);
    }
}
Andy Fedoroff
  • 26,838
  • 8
  • 85
  • 144
0

For those who are looking which is more appropriate or efficient between val and const:

If we are going to create String or any primitive data type then we must use const val instead of val. Because val will be known at runtime, so when your app is running then it will process all the values. On other hand const val will do this earlier at compile time.

Rahul Sharma
  • 5,212
  • 3
  • 31
  • 44