“const”和“val”有什么区别?

时间:2016-06-02 15:20:32

标签: constants kotlin

我最近读过const关键字,我很困惑!我找不到它和val关键字之间的任何区别,我的意思是我们可以使用它们来创建一个不可变的变量,还有什么我不知道的吗?

8 个答案:

答案 0 :(得分:265)

const是编译时常量。这意味着它们的值必须在编译期间分配,与val不同,它可以在运行时完成。

这意味着,永远不能将const分配给函数或任何类构造函数,而只能分配给String或原语。

例如:

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

const val bar = "Hello world"           //Also okay

答案 1 :(得分:25)

只是添加到Luka的回答中:

  

编译时间常数

     

在编译时已知的值的属性可以使用const修饰符标记为编译时常量。这些属性需要满足以下要求:

           

此类属性可用于注释。

来源:Official documentation

答案 2 :(得分:10)

将kotlin转换为Java

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

瓦尔科特林到Java

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

以简单语言

  1. 在编译时就知道const变量的值。
  2. val的值用于在运行时定义常量。

示例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"
}

这是因为getCar()在运行时求值,并将该值分配给Car。

此外-

  1. val 是只读的,表示在运行时已知的不可变
  2. var 是可变的,在运行时已知
  3. const 是不可变的,并且变量在编译时是已知的

答案 3 :(得分:9)

您可以将Kotlin转换为Java。 然后,您会看到 const static 修饰符比 val 多。 像这样的简单代码。

科特琳:

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

到Java(部分):

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

答案 4 :(得分:7)

在kotlin中,constval既代表不变性,又代表只读值,并在Java中充当final关键字。

val关键字必须用于声明运行时值,而const关键字必须用于声明编译时值。

请记住,const必须仅用于原始数据类型,而不能用于函数和构造函数。

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

答案 5 :(得分:6)

valconst都是不可变的。

const用于声明编译时常量,而val用于声明运行时常量。

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

val PICon = getIP()  // Assignment done at run-time

答案 6 :(得分:1)

val

与Kotlin val关键字相比,

Kotlin var关键字具有只读属性。 read-only属性的另一个名称是immutable

科特琳代码:

val variation: Long = 100L

等效的Java看起来像这样:

final Long variation = 100L;


const val

我们也将const关键字用于不可变属性。 const用于编译时已知的属性。就是这样。请考虑必须将const属性声明为 globally

科特琳码(在操场上):

const val WEBSITE_NAME: String = "Google"

fun main() {    
    println(WEBSITE_NAME)
}

Java代码(在操场上):

class Playground {

    final static String WEBSITE_NAME = "Google";

    public static void main(String[ ] args) {
        System.out.println(WEBSITE_NAME);
    }
}

答案 7 :(得分:1)

对于那些正在寻找 valconst 之间更合适或更高效的人:

如果我们要创建 String 或任何原始数据类型,那么我们必须使用 const val 而不是 val。因为 val 在运行时是已知的,所以当您的应用程序运行时,它将处理所有值。另一方面,const val 将在编译时更早地执行此操作。因此,性能明智的 const val 应该会给出更好的结果。