【问题标题】:What is the difference between "const" and "val"?“const”和“val”有什么区别?
【发布时间】:2016-10-02 10:21:21
【问题描述】:

我最近读到了const 关键字,我很困惑!我找不到constval 关键字之间的任何区别,我的意思是我们可以使用它们来制作一个不可变的变量,还有什么我遗漏的吗?

【问题讨论】:

标签: constants kotlin


【解决方案1】:

consts 是编译时常量。这意味着它们的值必须在编译时分配,不像vals,它可以在运行时完成。

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

例如:

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

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

【讨论】:

  • 像这样的东西怎么样:const val foo = "Hello world"val bar = "Hello world"?它们是一样的吗?
  • @MathewHany,至少不是在字节码方面,见:stackoverflow.com/questions/37482378/static-data-in-kotlin/…
  • 我认为 const 值将在编译期间完全内联。
  • 这引出了另一个问题:为什么 Kotlin 需要 const val 而不仅仅是 const?在我看来,val 关键字在这种情况下完全是多余的,因为const var 表面上看起来很荒谬。
  • @EricLloyd 对于const valconstval 的修饰符,而不是关键字。修饰符>关键字。更多相同设计的示例是annotation/enum/data classprivate valinline fun 等。
【解决方案2】:

只是为了补充卢卡的答案:

编译时常量

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

这样的属性可以用在注解中。

来源:Official documentation

【讨论】:

    【解决方案3】:

    您可以将 Kotlin 转换为 Java。 然后你可以看到 constval 多了一个 static 修饰符。 像这样的简单代码。

    科特林:

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

    【讨论】:

    • 有人可以在评论中说明为什么这个答案被否决了吗?
    • @JamesJordanTaylor 我投了赞成票。但我认为是因为有些人没有仔细阅读,乍一看这个答案似乎在谈论如何从 java 转换为 kotlin,这将是题外话。
    • 如果const 被删除,会产生不同的Java 文件吗?
    • @DYS:我认为它会删除“静态”,它将只是 public final String str = "hello";
    • @DYS 将其与 SimplePersonprivate final String name; 进行比较,后者没有 const 并且也是私有的,但那是因为它是成员 val 而不是顶级/包val 而不是因为const
    【解决方案4】:

    const kotlin 到 Java

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

    val kotlin 到 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 是不可变的,并且在编译时是已知的变量

    【讨论】:

      【解决方案5】:

      valconst 都是不可变的。

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

      const val VENDOR_NAME = "Kifayat Pashteen"  // Assignment done at compile-time
      
      val PICon = getIP()  // Assignment done at run-time
      

      【讨论】:

      • 编译时发生在运行时之前,对吧?
      • @whatwhatwhat 是的。代码在发送执行之前被编译。代码执行的时间点本质上就是所谓的运行时执行。
      【解决方案6】:

      Kotlin val 关键字用于 只读 属性,与 Kotlin var 关键字相比。 read-only 属性的另一个名称是 immutable

      Kotlin 代码:

      val variation: Long = 100L
      

      Java 等效项如下所示:

      final Long variation = 100L;
      


      常量值

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

      Kotlin 代码(在操场上):

      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】:

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

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

        【讨论】:

          【解决方案8】:

          因为我看了很多,那个“val”的意思是不可变的:肯定不是这样的,看这个例子:

          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
          }
          

          遗憾的是,您目前只能期望 const 具有真正的不变性 - 但这仅在编译时。在运行时,您无法创建真正的不变性。

          val 仅表示“只读”,您不能直接更改此变量,只能像我在上面的示例中显示的那样间接更改。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-07
            • 1970-01-01
            • 2015-05-26
            • 2013-07-12
            • 2010-10-27
            • 1970-01-01
            相关资源
            最近更新 更多