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?
8 Answers
const
s are compile time constants. Meaning that their value has to be assigned during compile time, unlike val
s, where it can be done at runtime.
This means, that const
s 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
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:
- Top-level or member of an object declaration or a companion object.
- Initialized with a value of type String or a primitive type
- No custom getter
Such properties can be used in annotations.
Source: Official documentation
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;
}
}
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
- The value of the const variable is known at compile time.
- 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 -
- val is read-only means immutable that is known at run-time
- var is mutable that is known at run-time
- const are immutable and variables that are known at compile-time
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
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);
}
}
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. So performance wise const val
should give better result.