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


276

我最近读过有关该const关键字的信息,我很困惑!我constval关键字之间找不到任何区别,我的意思是我们可以将它们都用作一个不可变的变量,还有什么我想念的吗?



Answers:


388

consts是编译时间常数。这意味着它们的值必须在编译时分配,这与vals 不同,后者可以在运行时完成。

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

例如:

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

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

3
什么是这样的:const val foo = "Hello world"val bar = "Hello world"?他们是一样的吗?
Mathew Hany

5
@MathewHany,至少不会在字节码的条款,请参阅:stackoverflow.com/questions/37482378/static-data-in-kotlin/...
热键

4
我认为const在编译过程中将完全内联值。
卢卡·雅各布维兹

102
这就引出了另一个问题:为什么Kotlin要求const val而不是仅仅要求const?在我看来,该val关键字在这种情况下是完全多余的,因为从const var表面上看这是荒谬的。
埃里克·劳埃德

18
@EricLloyd用const valconst是一个修正val,而不是关键字。修饰符>关键字。此相同的设计的更多实例,annotation/enum/data classprivate valinline fun,等等
阿罗

38

只是为了增加Luka的答案:

编译时常数

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

可以在注释中使用此类属性。

资料来源:官方文件


21

您可以将Kotlin转换为Java。然后您可以看到constval具有更多的静态修饰符。像这样的简单代码。

科特林:

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

2
有人可以在评论中说明为什么这个答案被否决了吗?
James Jordan Taylor

3
@JamesJordanTaylor我赞成。但是我认为这是因为有些人没有仔细阅读它,乍一看,这个答案似乎是在谈论如何从Java转换为kotlin,这是不合时宜的。
user1032613

2
如果const删除该文件,它将产生另一个Java文件吗?
DYS

2
@DYS:我认为它将删除“ static”,它将只是public final String str =“ hello”;
Varun Ajay Gupta

5

这两个valconst是不可变的。

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

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

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

4

const 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

在科特林,const并且val两者代表的不变性和只读值,并作为final在Java关键字。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.