ChatGPT解决这个技术问题 Extra ChatGPT

What is the difference between "const" and "val"?

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?


G
Gurwinder Singh

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

What about something like this: const val foo = "Hello world" and val bar = "Hello world"? Are they the same?
@MathewHany, at least not in terms of bytecode, see: stackoverflow.com/questions/37482378/static-data-in-kotlin/…
I think const values will just be completely inlined during compilation.
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.
@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.
C
Community

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


J
Jin Wang

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;
   }
}

Could someone state in a comment why this answer was downvoted to oblivion?
@JamesJordanTaylor I upvoted. But I assume it's because some people didn't read it carefully, and at a quick glance this answer seems to be talking about how to convert from java to kotlin, which would be off-topic.
What if const is removed, will it yield a different Java file?
@DYS: I think it will remove the "static" and it will be just public final String str = "hello";
@DYS compare it to SimplePerson's private final String name; which doesn't have the const and then is private as well, but that's because it's a member val instead of a top-level/package val and not because of the const.
S
Shivam Tripathi

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


K
Kifayat Ullah

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

Compile-time happens before run-time, right?
@whatwhatwhat yes. The code is compiled before being sent for execution. The point of time when the code executes is what is essentially known as run-time execution.
@whatwhatwhat Yes compile-time happen before runtime.
val is not necessarily immutable.
A
Andy Jazz

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);
    }
}

Read-only is not the same thing as immutable so the second sentence of this answer is false. You can have a read-only val that produces different results on multiple calls through a custom getter or because it’s a delegated property, or because it’s open and has a setter in a subclass
"Kotlin val keyword is for read-only properties" if so then why do you write to it in your example?
h
henry86

Because I read a lot, that "val" means immutable: This is definitely not the case, just see this example:

class Test {
    var x: Int = 2
    val y
        get() = x
}

fun main(args: Array<String>) {
    val test = Test()
    println("test.y = ${test.y}") // prints 2
    test.x = 4
    println("test.y = ${test.y}") // prints 4
}

Sadly, true immutability you can currently only expect with const - but this only at compile time. At runtime you can't create true immutability.

val just means "readonly", you can't change this variable directly, only indirect like I have shown in the example above.


wow, remarkable!
R
Rahul Sharma

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 will give better result.